【问题标题】:the program does not terminate程序不会终止
【发布时间】:2017-12-15 20:08:50
【问题描述】:
#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 然后 james 然后绑定到两个 fget 但它只是不断要求更多输入。

【问题讨论】:

  • while(array[j][k] != '\0') ==> if(array[j][k] == '\0') {break;} 因为你已经在循环k。以下行应使用索引k 而不是1,假设您想将每个'a' 大写。
  • 您为什么期待任何结果?您的代码不输出任何内容。
  • @ChrisTurner 程序没有终止,它继续接受输入
  • 否 - 它只接受 num_test 输入行。根据@WeatherVane 的评论,它不会因为不必要的while 循环而终止
  • 确实,while 循环一旦开始就永远不会终止,因为它的主体没有任何改变会导致它终止。

标签: c arrays string while-loop


【解决方案1】:

在这个代码块中

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。

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2011-09-19
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多