遍历数组似乎不起作用

时间:2019-01-23 14:42:40

标签: c

该程序应该遍历文件,并且当字符与给定模式之一匹配时,为其数组单元分配0或1。然后显示来自太空和星星的隐藏消息。但是它会根据文件中的最后一个字符为数组中的所有单元分配0或1。

示例文件通过(30A.dat)循环播放: ZuVbJJgFyMuVaXsRkgPuHJmNgiNPFJmHDVRFmPcNLgDykaFugooidgyBhgNEsVdXCcsaYyaYQEGsNhpIxOJHyFjluiNvoFJLSTRVlEPPHGNowGeavuRnNySivmuQXXLgxDKRXPutaBOgNYiZvtPwoYHXEFcrVVOJwirHoOwmxDqFILoHfygqNcBfXLsDMXtNymytqEgCeoMoIosuctXbsmDUsmfBwzJqBMyTHjaunrlTWjzxMuBhvUGIxRAqcrFheCGUzlhLKeLHAcsvaZCaNyzuwiMgkVBbLzBHPUiXlXDXTIwjqTHvIeWFTXLdDYccceSQBfIXDagvZPesYQdjeeUVZVqdyxPcFwxaWJywgWXviFkyKoz

int tab_a[a][c];

int i = 0;
int j = 0;

while((znak = fgetc(plik2)) != EOF){
    for(int i = 0; i < a; i++){
        for(int j = 0; j < c; j++){
            if((znak == 'a') || 
                 (znak == 'B') || 
                 (znak == 'c') || 
                 (znak == 'D') || 
                 (znak == 'e') || 
                 (znak == 'F') || 
                 (znak == 'g') || 
                 (znak == 'H') || 
                 (znak == 'i') || 
                 (znak == 'J') || 
                 (znak == 'k') || 
                 (znak == 'L') || 
                 (znak == 'm') || 
                 (znak == 'N') || 
                 (znak == 'o') || 
                 (znak == 'P') || 
                 (znak == 'q') || 
                 (znak == 'R') || 
                 (znak == 's') || 
                 (znak == 'T') || 
                 (znak == 'u') || 
                 (znak == 'V') || 
                 (znak == 'w') || 
                 (znak == 'X') || 
                 (znak == 'y') || 
                 (znak == 'Z'))
                {
                    tab_a[i][j] = 0;
                }
            else if((znak == 'A') || 
                        (znak == 'b') || 
                            (znak == 'C') || 
                            (znak == 'd') || 
                            (znak == 'E') || 
                            (znak == 'f') || 
                            (znak == 'G') || 
                            (znak == 'h') || 
                            (znak == 'I') || 
                            (znak == 'j') || 
                            (znak == 'K') || 
                            (znak == 'l') || 
                            (znak == 'M') || 
                            (znak == 'n') || 
                            (znak == 'O') || 
                            (znak == 'p') || 
                            (znak == 'Q') || 
                            (znak == 'r') || 
                            (znak == 'S') || 
                            (znak == 't') || 
                            (znak == 'U') || 
                            (znak == 'v') || 
                            (znak == 'W') || 
                            (znak == 'x') || 
                            (znak == 'Y') || 
                            (znak == 'z'))
                {
                    tab_a[i][j] = 1;
                }
            }
        }
    }
for(int i = 0; i < a; i++){
    for(int j = 0; j < c; j++){
        if(tab_a[i][j] == 1){
            printf("*");
        }
        else{
            printf(" ");
        }
     }
     printf("\n");
}

fclose(plik);

2 个答案:

答案 0 :(得分:0)

当然可以:

对于 每个 字符读取,遍历 所有 数组元素,并检查每次读取的字符是否为在a-zA-Z中。如果是这样,(这将始终为真),然后根据if语句将array元素设置为0或1。实际上,数组值将全部基于最后读取的字符。

现在,您真正想要的还不清楚,所以我无法提供完整的解决方案。

答案 1 :(得分:0)

类似的事情可能起作用。
创建一个有效字符数组。
从文件中读取一个字符到znak中。
strchr将检查znak是否为有效字符之一。
如果是这样,请设置为零。如果没有,请设置一个。
递增j。如果j等于c,请将j重置为零并递增i
读另一个字符。
i等于a时,数组已满。 Break走出循环。

char valid[] = "aBcDeFgHiJkLmNoPqRsTuVwXyZ";
while ( (znak = fgetc(plik2)) != EOF) {
    if ( strchr ( valid, znak)) {
        tab_a[i][j] = 0;
    }
    else {
        tab_a[i][j] = 1;
    }
    j++;
    if ( j >= c) {
        j = 0;
        i++;
        if ( i >= a) {
            break;
        }
    }
}