在字符串的某些位置获取字符

您好,先生们,女士们!

这就是我的atm。

#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 '\0' 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”

and I would get the output with the texto.txt coordinates (A means first line, 1 means first word, 1 means first letter of the word).

程序运行正常,我可以打印要打印的坐标。但是在那个庞大的胖代码中却存在分段错误。不同的OS给我不同的结果,我的程序可以正常运行,但是在另一个OS中,我看到分段错误。

我试图找到方法/工具来找出问题出在哪里,但是我是一个新手,我已经用尽所有代码努力达到这一点。

任何形式的帮助,代码更改,都可以使问题更加明显。当您回答时,请确保我是C编程的新手。

评论