当我运行这个代码。代码应该要求第二个scanf字符串。但它是打印一些垃圾值..请解释这为什么会发生?
int main()
{
char arr[50];
int ll;
char sb[20];
printf("enter the string\n");
scanf("%[^\n]s",arr);
printf("string=%s\n",arr);
printf("\n enter sub");
scanf("%[^\n]s",sb);
printf("\n sub-string=%s",sb);
return 0;
}
答案 0 :(得分:3)
我没有测试过自己...
scanf("%[^\n]s",arr);
遇到\n
stdin
仍然保留\n
scanf("%[^\n]s",sb);
在第一次人为输入结束时遇到相同的\n
时停止
顺便说一句,最好使用fgets
和sscanf
的组合代替scanf
。
答案 1 :(得分:1)
替换:
scanf("%[^\n]s",arr);
...
scanf("%[^\n]s",sb);
使用:
scanf("%49s %19s",arr,sb);
答案 2 :(得分:1)
"%[...]"
不需要尾随's'
"%[...]"
不消耗领先的空白区域
无论何时扫描字符串,都包含宽度限制
检查scanf()
返回值。
char arr[50];
// v--- Space added to consume any white-space including any \n
if (scanf(" %49[^\n]", arr) != 1) Handle_Error();
char sb[20];
if (scanf(" %19[^\n]", sb) != 1) Handle_Error();
在OP的原始代码中,OP正在变得垃圾,因为scanf()
不起作用。第一个"%[^\n]s"
可能正常工作,但在'\n'
中留下stdin
以进行下一个IO操作。第二个"%[^\n]s"
尝试扫描剩余的'\n'
,因为它与"%[^\n]"
不匹配,scanf()
停止并且在sb
中没有放置任何内容。因此,未初始化的sb
包含了它开始使用的任何垃圾。
更好的是,使用fgets()
。
答案 3 :(得分:0)
如果您不想使用fgets或sscanf
,请使用此代码int main()
{
char arr[50];
int ll;
char sb[20];
printf("enter the string\n");
scanf("%[^\n]s",arr);
fflush(stdin);//to clear \n from the buffer
printf("string=%s\n",arr);
printf("\n enter sub");
scanf("%[^\n]s",sb);
printf("\n sub-string=%s",sb);
return 0;
}