2012-03-31 108 views
2

我是Cstring的新手,很抱歉问哑巴问题,请帮忙。scanf如何处理空白空间?

char string[10]; 

printf("Give me your last name:\n"); 
scanf ("%s", string);     //if i type 123 123 
printf("Original string:%s\n", string); //it shows 123 

对比:

char string[] = "123 123"; 

printf("Original string:%s\n", string); //it shows 123 123 

回答

2

这是正确的行为。默认情况下,scanf会读取字符串,直到达到空格。

scanf手册页:

小号
匹配的非空白字符的序列; 下一个指针必须是足够长的字符数组指针 以保存输入序列和终止的 空字符('\ 0'),该字符会自动添加。 输入字符串在空白处或最大字段宽度处停止,以先发生者为准, 。

6

问题是scanf函数。当你用%s使用scanf时,它会读取直到它遇到空格。 要阅读整条生产线,您可能需要考虑使用fgets()

+1

永远,永远不会使用'得到()'。改为使用'fgets()'或'getline()'。 – 2012-03-31 17:20:36

5

scanf将空格视为字符串的结尾。
所以一旦遇到space这个字符就会停止阅读。

虽然在c风格阵列的情况下\0被视为数组的末尾。
当初始化,

char string[] = "123 123"; 

一个\0在第7个字符3结束隐式添加,它标志着这个数组的结尾。

1

由于scanf()的工作原理,您在这里看到的情况。你可以打印任何字符的字符串(不管是否是空格)。 scanf()只是在遇到空白时停止,因为它认为这个变量“已完成”。

1

scanf扫描字符串直到出现任何空格。如果你需要读取,直到一个换行符,然后使用fgets()

char string[64]; 
fgets(string, sizeof(string), stdin); 

printf("%s", string); // should now contain any whitespace in the string.