先生们和女士们,大家好!
这就是我的自动取款机。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
const int numerolinhas = 8;
const char ficheirodec='t';
const char ficheirobin = 'b';
int primeiracoordenada(char opcao1) {
int numero;
numero = ((int)(opcao1))-64;
if(numero<1 || numero >8){
printf("Error: Invalid coordinate.n");
exit(1);
}else{
return numero;
}
}
int segundacoordenada(char opcao2){
int numero;
if(opcao2 == '1' || opcao2 == '2' || opcao2 == '3' || opcao2 == '4' || opcao2 == '5' || opcao2 == '6' ||opcao2 == '7' || opcao2 == '8'){
numero = (int)(opcao2) - 48; /* Converter para numero de 1 a 8 na tabela ascii*/
numero = (numero -1) * 4;
return numero;
}else{
printf("Error: Invalid coordinate.n");
exit(1);
}
}
int terceiracoordenada(char opcao3){
int numero;
if(opcao3 == '1' || opcao3 == '2' || opcao3 == '3'){
numero = (int)(opcao3)-48; /* Converter para numero de 1 a 3 na tabela ascii*/
numero -= 1;
return numero;
}else{
printf("Error: Invalid coordinate.n");
exit(1);
}
}
void leituracartao(char opcao1, char opcao2, char opcao3){
int i = 0;
char linha[8][35];
FILE *ficheiro;
ficheiro = fopen("texto.txt","r");
if (ficheiro == NULL){
printf("Error: could not open file.");
exit(1);
}
while(fgets(linha[i], 35, ficheiro)){
i++;
}
fclose(ficheiro);
for(i = 0; i <=numerolinhas; ++i)
{
if(primeiracoordenada(opcao1) == i){
if(linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]>4 && linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]<58){
printf("%c ", linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]);
}else{
printf("Error: File is corrupted.");
exit(1);
}
}
}
}
void leituracartaob(char opcao1, char opcao2, char opcao3){
int i = 0;
char linha[8][25]; /* 24 *8 faz o total de os 192 bytes e de seguida acrescatamos +1 byete para por o char ' ' em cada linha*/
FILE *ficheiro;
ficheiro = fopen("argv[1],","br");
if (ficheiro == NULL){
printf("Error: could not open file.");
exit(1);
}
while(fgets(linha[i], 35, ficheiro)){
i++;
}
fclose(ficheiro);
for(i = 0; i <=numerolinhas; ++i)
{
if(primeiracoordenada(opcao1) == i){
if(linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]>47 && linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]<58){
printf("%c ", linha[primeiracoordenada(opcao1)-1][segundacoordenada(opcao2)+terceiracoordenada(opcao3)]);
}else{
printf("Error: File is corrupted.");
exit(1);
}
}
}
}
int main(int arg, char *argv[])
{
FILE *ficheiro;
char opcao1 =0;
char opcao2 = 0;
char opcao3 = 0;
char opcao4 =0;
char opcao5 = 0;
char opcao6 = 0;
char opcao7 =0;
char opcao8 = 0;
char opcao9 = 0;
char pedido[14];
if (arg != 3 ) {
printf("Error: Invalid arguments.");
exit(1);
}
if(*argv[2]== ficheirodec){
ficheiro = fopen(argv[1],"r");
if (ficheiro == NULL){
printf("Error: could not open file.");
exit(1);
}
scanf("%[^n]s", pedido);
opcao1 = pedido[0];
opcao2 = pedido[1];
opcao3 = pedido[2];
opcao4 = pedido[4];
opcao5 = pedido[5];
opcao6 = pedido[6];
opcao7 = pedido[8];
opcao8 = pedido[9];
opcao9 = pedido[10];
leituracartao(opcao1, opcao2, opcao3);
leituracartao(opcao4,opcao5,opcao6);
leituracartao(opcao7,opcao8,opcao9);
}else{
if(*argv[2]== ficheirobin){
ficheiro = fopen(argv[1],"br");
if (ficheiro == NULL){
printf("Error: could not open file.");
exit(1);
}
scanf("%[^n]", pedido);
opcao1 = pedido[0];
opcao2 = pedido[1];
opcao3 = pedido[2];
opcao4 = pedido[4];
opcao5 = pedido[5];
opcao6 = pedido[6];
opcao7 = pedido[8];
opcao8 = pedido[9];
opcao9 = pedido[10];
leituracartaob(opcao1, opcao2, opcao3);
leituracartaob(opcao4,opcao5,opcao6);
leituracartaob(opcao7,opcao8,opcao9);
}
}
fclose(ficheiro);
return 0;
}
这个程序应该在打开之前要求参数(在我的示例中,类似于
argv[1] = "texto.txt"
argv[2] = 't'
然后它将读取一个文本文件。在该文本文件中,我有 8 行像矩阵一样。该文件具有以下配置:
042 811 268 930 893 582 838 307
(new line of file here)
972 019 257 399 054 070 433 138
(new line of file here)
189 083 331 047 303 922 470 475
(new line of file here)
667 974 152 342 046 800 560 362
(new line of file here)
(还有一点,总共 8 行,每一行都像这样,但带有随机数(。
在我的控制台上,我可以使用以下命令:
"./projecto3 texto.txt t">
然后输入一些输入,像这样
"A11 A12 A13">
我会得到带有texto.txt
坐标的输出(A 表示第一行,1 表示第一个单词,1 表示单词的第一个字母(。
程序工作正常,我可以打印要打印的坐标。但是在那个又大又胖的代码中存在一个分段错误。不同的操作系统给了我不同的结果,我可以让程序在我的系统上没有任何问题地工作,但在另一个操作系统中,我看到了分段错误。
我正在尝试找到方法/工具来找出这里的问题所在,但我是一个新手,我已经努力用我的所有代码达到这一点。
任何类型的帮助,代码更改,只是问题所在的行将不胜感激。当你回答时,请确保我是c编程的新手。
看起来 ficheiro 未初始化。
我运行了cppcheck并得到了这个:
~/work/scratch $ cppcheck main.c
Checking main.c ...
main.c:159:12: error: Uninitialized variable: ficheiro [uninitvar]
fclose(ficheiro);
^