scanf中的%[^ \ n] s不等待输入并被跳过

时间:2017-03-26 13:13:03

标签: c string input scanf

在下面代码的循环中,scanf("%[^\n]s",array)无效。它不等待输入并被跳过。但是%之前的空格修复了这个问题。为什么呢?

这是错误的程序:

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

int main()    
{    
    int t;
    scanf("%d",&t);
    while(t--){
        char arr[199];
        scanf("%[^\n]s",arr);
        printf("%s",arr);
    }
    return 0;
}

这是正确的代码:

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

int main()
{    
    int t;
    scanf("%d",&t);
    while(t--){
        char arr[199];
        scanf(" %[^\n]s",arr);
        printf("%s",arr);
    }
    return 0;
}

为什么%之前需要空格才能按预期工作?

2 个答案:

答案 0 :(得分:2)

首先,s的尾随%[ %[^\n]格式说明符的一部分,因此请将其删除,然后讨论%[^\n]

现在,scanf告诉'\n'要做的是扫描所有内容,直到换行符(EOF)或arr,以先到者为准,并将其存储在相应的在这种情况下,%[^\n]

以下是问题: \n如果要读取的第一个字符是scanf 则会失败。

你说,

'等等'。 '我没有输入单独输入。那么,它为什么会失败?'。真正。你没有。但请记住你为前一行按下的 Enter ?事实证明,之前对\n的调用会抓取所有内容,直到\n离开scanf 并返回。因此,在循环的下一次迭代中,\n看到前一次调用scanf时遗留的scanf字符,失败并返回0.

至于空间,它是一个空白字符。 \n中的空白字符指示它扫描并丢弃所有空白字符,直到第一个非空白字符。因此,它删除了scanf(因为它是一个空格字符),{{1}}将等待进一步的输入。

答案 1 :(得分:1)

使用此格式%[^\n]scanf()在阅读换行符后停止。因此,在第一次输入之后,还有一个未消耗的换行符。 因此,后续的scanf()调用根本不会读取任何输入。

如果%[^\n]中有空格,则scanf()会忽略任意数量的空白字符。因此,scanf()忽略了剩余的换行符。来自scanf

  

一系列空格字符(空格,制表符,换行符等;请参阅   isspace为(3))。该指令匹配任意数量的空白区域,   包括无,在输入中。

顺便说一下,在格式字符串的末尾不需要额外的s

使用通常优于scanf()的{​​{3}}(如果有空格,fgets()会将新行字符读入缓冲区)。另请参阅:fgets()