该程序不会终止

时间:2017-07-11 16:29:06

标签: c arrays string while-loop

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


int main(){

    int num_test,i,j,k;
    scanf("%d ",&num_test);
    char array[num_test][35];
    for (i=0;i<num_test;i++){
        fgets(array[i],35,stdin);
        array[i][strcspn(array[i],"\n")]='\0';
    }
    for (j=0;j<num_test;j++){
        for (k=0;k<35;k++){
            while(array[j][k] != '\0'){        // I am seeing when the name entered ends then this loop should stop. 
                if (array[j][1] == 'a'){
                    array[j][1] = 'A';
                }
            }
        }           
    }
    return 0;
}

上面的代码没有终止,但继续接受输入并且没有显示结果。如果我删除第二个for循环,问题不会持续存在。我输入2到scanf然后詹姆斯然后绑定到两个fgets但它只是继续要求更多的输入。

1 个答案:

答案 0 :(得分:0)

在此代码块中

for (j=0;j<num_test;j++){
    for (k=0;k<35;k++){
        while(array[j][k] != '\0'){
            if (array[j][1] == 'a'){
                array[j][1] = 'A';
            }
        }
    }
}

你有一个不必要的while循环,一旦开始就永远不会终止,因为该循环中的任何内容都不会改变循环条件的结果。假设您的目标是将'a'的每次出现更改为'A'我建议

for(j = 0; j < num_test; j++) {
    for(k = 0; k < 35; k++) {
        if(array[j][k] == '\0') {
            break;                      // quit when terminator found
        }
        if(array[j][k] == 'a') {        // changed 1 to k
            array[j][k] = 'A';          // changed 1 to k
        }
    }
}

我还建议使用35#define替换“幻数”const int