2012-12-11 43 views
0
#include <stdio.h> 

int main() 
{ 
    int a; 
    char msg[10]; 
    scanf("%d",&a); 
    printf("%d\n",a); 
    scanf("%[^\n]s",msg); 
    printf("%s\n",msg); 
    return 0; 
} 

程序正在接受整数值并打印它,但第二个scanf()调用不接受任何东西。为什么是这样?scanf with^operator

^\ n对上下文中的scanf语句有什么影响。

+0

'%[^ \ n]'本身就是一个“事物”,你不需要在它后面使用's'。顺便说一句,这可能被认为是字面意思,这会影响你的扫描。 – Spidey

回答

0

第一scanf函数只是更改为:

scanf("%d\n",&a); 

否则第二scanf函数只是看到了\ n和读数为0的项目(因此离开你的味精不变

随着你的原代码,以及一些新增的诊断:

#include <stdio.h> 
#include <string.h> 
int main() { 
    int a; 
    int itemsScanned; 
    char msg[10]; strcpy (msg, "unchanged"); 
    itemsScanned=scanf("%d",&a); 
    printf("itemsScanned=%d a=%d\n",itemsScanned, a); 
    itemsScanned=scanf("%[^\n]s",msg); 
    printf("itemsScanned=%d msg=%s\n",itemsScanned, msg); 
    return 0; 
} 

(当输入3 < \ NL)的输出是:

> ./a.out 
3 
itemsScanned=1 a=3 
itemsScanned=0 msg=unchanged 

在第一scanf的附加\ n和进入5 \ nlHugo \ NL:

./a.out 
5 
Hugo 
itemsScanned=1 a=5 
itemsScanned=1 msg=Hugo 
+0

我想知道为什么会发生这种情况 – dgms

+0

因为你的第一个scanf离开了“缓冲区”中的\ n。然后下一个scanf应用你的格式化字符串,并找到\ n,所以它不能读取任何东西。 – pbhd

0
scanf("%[^\n]s", msg); 

这可能不是你想要的,你不需要后的s扫描集。这样做,您可以告诉scanf查找s字符。

2

如果控制台看起来是这样的:

123 
abc 

然后stdin将内容:123\nabc\n

一个scanf呼叫与"%d"格式字符串后,stdin现在是:\nabc\n。请注意,\n尚未使用。

指定器%[^\n](该s不应该存在,那将只是被当作一个多余的字符后,立即消费)指读取每一个字符,直到\n,所以由于存在\n之前没有字符在字符串的开头没有东西会被存储到缓冲区中,并且stdin将保持为:\nabc\n


为了解决这个问题,第一scanf格式字符串更改为"%d\n",因此,一些被读取后\n会被消耗掉。由于%[^\n]也不会消耗\n,因此您可能还需要将该格式字符串更改为"%[^\n]\n"