【问题标题】:loop terminating early in C循环在 C 中提前终止
【发布时间】:2020-11-11 17:17:13
【问题描述】:

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

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');

【问题讨论】:

  • 请添加一个空格,以便 tnat scanf("%[^\n]",&amp;str); 变为 scanf(" %[^\n]",str); 以删除缓冲区中留下的换行符(同时删除 &amp;)。
  • &amp;也去掉str前面。但我会改用fgets
  • scanf() 无法读取空字符串。
  • 如果你想读一行,使用fgets()
  • stringArray[count][m]=str[m]; 这样你就不会在字符串末尾存储\0,这会导致奇怪的结果

标签: c loops scanf newline do-while


【解决方案1】:

首先是 scanf 调用的第二个参数

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

具有不正确的类型 char ( * )[100] 而不是 char *

你需要写

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

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

至少你需要阅读它,例如

scanf( "%*c" );

虽然使用函数fgets而不是scanf会更简单。

例如

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

使用 while 循环代替 do-while 循环会更好。

例如

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

【讨论】:

  • 不是str[0] != '\0',而是str[0] != '\n'
  • @mr.loop 字符串中可以不存在换行符。
  • 你的代码在遇到空字符串后不会停止输入,因为空字符串会有换行符
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多