2017-03-26 43 views
5

在下面的代码循环中,scanf("%[^\n]s",array)不起作用。它不会等待输入并跳过。但%之前的空间解决了这个问题。为什么?%scanf中的[^ n] s不会等待输入并被跳过

下面是错误的程序:

#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; 
} 

为什么它需要%前的空间,预期它的工作?

+0

这是因为你有一个需要跳过的换行符。第一个scanf只是读取数字,你仍然在输入中留下换行符。并且循环中的scanfs不会在换行符中读取,要么没有空间来吸收剩余的换行符。实际上你可以在循环中使用scanf(“%s”,arr)。 – Shiping

+0

你可能想检查一下:https://stackoverflow.com/questions/45038176/not-able-to-input-a-string-with-spaces-in-a-loop-in-c/45038767?noredirect= 1#comment77052162_45038767我最近回答 –

回答

1

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

%[^\n]的空间中,scanf()会忽略任何数量的空白字符。因此,scanf()忽略了剩余的换行符。从scanf

的空白字符的序列(空格,制表,换行,等;见 isspace为(3))。该指令与输入中的任意数量的空白空间 (包括无)匹配。

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

使用fgets()这通常优于scanf()fgets()会在有空间的情况下将新行字符读入缓冲区)。另见:Why does everyone say not to use scanf? What should I use instead?

+0

Thnxxx我现在明白了...真的很感谢 – ammasum

2

首先,尾随s%[格式说明的部分,因此将其删除,并让谈%[^\n]

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

这里是捕获:%[^\n]如果要读取的第一个字符是\n失败。

'等待',你说。 '我没有输入一个单独的输入。那么,它为什么会失败?'。真正。你没有。但请记住输入您按下了上一行吗?事实证明,前面的电话scanf抓住一切,直到\n,离开\n那里并返回。因此,在循环的下一次迭代中,scanf看到这个\n字符以前调用遗留下来scanf,失败并返回0。

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