为什么 OP 代码会失败:使用像 5 Enter a space b 这样的用户输入kbd> 回车.
第一个scanf() 消耗"5",将"\na b\n" 留给下一个scanf()。 scanf() 不会扫描任何内容,也不会将任何内容保存到str,因为第一个char 是'\n'。
scanf("%d",&n);
scanf("%[^\n]s",str);
对于读取一行scanf("%[^\n]s",str);有很多问题。
"%[^\n]s" 中的s 没有理由
如果输入为"\n","%[^\n]" 不会将任何内容保存到str。
没有防止读取过多数据的保护。
代码应该检查来自scanf()的返回值。
正如许多人建议的那样,使用fgets()
char str[500];
if (fgets(str, sizeof str, stdin) == NULL) HandleEOForIOerror();
// to remove '\n'
size_t len = strlen(str);
if (len > 0 && str[len-1] == '\n') str[--len] = 0;
printf("%s",str);
要读取号码,推荐相同,使用fgets()
#include<stdio.h>
int main(void) {
int n;
char str[500];
if (fgets( str, sizeof str, stdin) return -1;
if (1 == sscanf(str, "%d",&n)) {
printf("%d\n",n);
}
if (fgets( str, sizeof str, stdin) return -1;
printf("%s",str);
return 0;
}