为什么第二个 scanf 不接受任何输入? %s cancatanae 是字符串吗?
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char string1[50];
char string2[50];
scanf("%[^\n]s",string1);
scanf("%[^\n]s",string2);
printf("\nfirst string :%s \n",string1);
printf("\nsecnd string :%s \n",string2);
return 0;
}
输入:这是 BBC [输入]
输出:第一个字符串:这是 bbc 第二个字符串:{一些字符符号}
最佳答案
"%[^\n]s"
告诉 scanf
“吃掉”所有不是换行符的字符并将它们放入参数中;这意味着,在第一个 scanf
返回后,它将留下换行符,使其停止在读取缓冲区中。下一个 scanf
找到它并立即停止读取 - 毕竟,您告诉它读取到第一个换行符!
这里的解决方案可以是使用 "%[^\n]s\n"
,它甚至“吃掉”字符串后面的换行符,甚至是 "%[^\n]s "
,其中的空格是“神奇的”,因为它告诉 scanf
吃掉它能找到的所有其他空格,其中包括换行符(但请注意,这是一个如果您希望能够在下一行中读取空字符串,那么这是个坏主意)。
更简单的是,您可以简单地使用 fgets(string1, sizeof(string1), stdin)
,这与 scanf
和 %s
不同,可以防止缓冲区溢出(是的,您甚至可以使 %s
安全,但需要更多工作)。请注意,fgets
甚至将尾随换行符放入字符串中。
关于c - 同时使用两个 scanf(%s) 有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38159991/