问题一:scanf()接收数据时,遇到空格,回车,TAB会结束数据输入。
分析下面的代码:
int main()
{
char string[20], str1[20], str2[20];
scanf("%s",string); //用户输入字符串"I Love You!",但scanf只能把标准输入流中的I传给string[ ],余下的字符存在缓冲区中
printf("%s",string); //输出结果:I
scanf("%s",str1); //无需输入,scanf会把标准输入缓存中的Love传给str1[ ]
printf("%s",str1); //输出结果:Love
scanf("%s",str2); //无需输入,scanf会把标准输入缓存中的You!传给str2[ ]
printf("%s",str2); //输出结果:You!
exit(0);
}
root#a.out
root#I Love You! //输入
root#ILoveYou! //结果
为了避免上述空格,TAB带来的意外出现,我们必须清除标准输入缓冲区的残余信息。
方法1是:fflush(stdin);
方法2是:scanf("%[^/n]",string);
问题二:假设程序用scanf()接收字符,分析下面的代码存在的问题:
for(i=0;i<4;i++)
{
scanf("%c",&c);
printf("%c",c);
}
root#a.out
root#1 2 //输入1 空格 2 回车
root#1 2 //输出1 空格 2 回车,进程结束
显然,程序把缓存中的空格和回车也当成字符输出。
修改代码如下:
for(i=0;i<4;i++)
{
scanf(" %c",&c); // %c前添加空格,在接收单字符时可清除缓冲区中的空格和回车
printf("%c",c);
}
root#a.out
root#1 2 //输入1 空格 2 回车
root#12 //输出1 2
root#34 //输入3 4 回车
root#34 //输出3 4,进程结束
%c前的空格清除了缓冲区的空格和回车。