scanf如何处理空白空间?
问题描述:
我是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
答
这是正确的行为。默认情况下,scanf
会读取字符串,直到达到空格。
从scanf
手册页:
小号
匹配的非空白字符的序列; 下一个指针必须是足够长的字符数组指针 以保存输入序列和终止的 空字符('\ 0'),该字符会自动添加。 输入字符串在空白处或最大字段宽度处停止,以先发生者为准, 。
答
scanf
将空格视为字符串的结尾。
所以一旦遇到space
这个字符就会停止阅读。
虽然在c风格阵列的情况下\0
被视为数组的末尾。
当初始化,
char string[] = "123 123";
一个\0
在第7个字符3
结束隐式添加,它标志着这个数组的结尾。
答
由于scanf()
的工作原理,您在这里看到的情况。你可以打印任何字符的字符串(不管是否是空格)。 scanf()
只是在遇到空白时停止,因为它认为这个变量“已完成”。
答
scanf
扫描字符串直到出现任何空格。如果你需要读取,直到一个换行符,然后使用fgets()
:
char string[64];
fgets(string, sizeof(string), stdin);
printf("%s", string); // should now contain any whitespace in the string.
永远,永远不会使用'得到()'。改为使用'fgets()'或'getline()'。 – 2012-03-31 17:20:36