循环在C中提前终止

问题描述

遇到了我必须输入多个字符串作为输入的问题。 现在,我的逻辑是创建一个二维数组,其中(示例)

Input:
ABD
okay

将存储为

[['A','b','D'],['o','k','a','y']]

理想情况下,它应该在我输入空字符串时终止。

但是我的代码(如下)仅需要第一个输入并终止。

    char str[100];
    char stringArray[50][100];
    int k,m,count=0,i=0,j=0;
    do {
        scanf("%[^\n]",&str);
        k=strlen(str);
        for(m=0;m<k;m++){
            stringArray[count][m]=str[m];
        }
        count++;
    }
    while (str[0] != '\0');

解决方法

对于初学者,scanf调用的第二个参数

scanf("%[^\n]",&str);

具有错误的类型char ( * )[100]而不是char *

您需要写

scanf("%[^\n]",str);

但是,在此调用之后,换行符'\n'仍保留在输入缓冲区中。

至少您需要阅读例如

scanf( "%*c" );

尽管使用函数fgets代替scanf会更简单。

例如

fgets( str,sizeof( str ),stdin );

与使用do-while循环相比,使用while循环会更好。

例如

while ( fgets( str,stdin ) != NULL && str[0] != '\n' )
{
    //...
} 
,

这是更正的

do {
        scanf(" %[^\n]",str);
        k=strlen(str);
        for(m=0;m<k;m++){
            stringArray[count][m]=str[m];
        }
        count++;
    }
    while (str[0] != 'g'); //or anything else other than g