学过字符串,我们都知道当输入一串带空格的字符
(通俗的说,就是英语中由一个个单词组成的一句话)时,举个例子,比如my name is aeiou
如果你用scanf直接输入的话,
像这样
scanf("%s",str);
结果是这样的…
my
由运行结果我们可以看出,它遇到空格就停止读入了。
So 我们一般都选择用gets函数来读入一个带空格的字符串
就像这样
gets(str);
运行出来是这样的
my name is aeiou
这是因为gets可以读入空格,遇到回车才会停止;而scanf遇到空格、回车和Tab键都会认为输入结束,所以它是不能接收空格的。
但是我们都知道gets是不安全的(尽管我现在还没有遇到过这种情况,但是C++认为gets是不安全的)
So 如果你想用scanf输入一个带空格的字符串的话,也不是不可以,下面就来说一下怎么用。
我们可以这样写
scanf("%[^\n]",str);
这样的话运行结果是
my name is aeiou
不要问为什么,记住这个[^\n]就行了,如果实在想知道的话可以去搜百度。
但是你会发现一个问题
请看这个代码(这是一个统计元音字母的题的完整代码)
#include<>
#include<>
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
char str[105];
int f[5]={0};
scanf("%[^\n]",str);
int i;
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='a')
{
f[0]++;
}
else if(str[i]=='e')
{
f[1]++;
}
else if(str[i]=='i')
{
f[2]++;
}
else if(str[i]=='o')
{
f[3]++;
}
else if(str[i]=='u')
{
f[4]++;
}
}
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",f[0],f[1],f[2],f[3],f[4]);
if(n!=0)
{
printf("\n");
}
}
return 0;
}
你会发现运行结果是完全错误的,是不是满脑子充满了问号;其实真正的罪魁祸首就在于回车键,因为我们知道gets对末尾回车符的处理是接收回车并把回车替换为\0,而使用scanf时其会将末尾的回车符保留在缓存当中,所以在用其输入字符串时一定要加一个getchar去吃掉回车符,或者也可以用:
scanf("%[^\n]%*c",str);
这样运行结果也是正确的