# include <stdio.h>
int main (void)
{
char b;
char str[13333];
scanf("%s", str);
scanf("%c", &b);
printf("%s\n", str);
printf("%c\n", b);
return 0;
}
这是因为‘\n’被当作字符输入到字符变量b中了。
所以加上printf的两个回车,一共三个回车。
# include <stdio.h>
int main (void)
{
int a;
char str[1333];
scanf("%s", str);
scanf("%d", &i);
printf("%s\n", str);
printf("%d\n", i);
return 0;
}
这里输入字符串之后回车,黑框框会继续等待用户输入,和两个实数输入是一样的,回车之后等待下一次输入。但是,我这里有一点不明白的是为什么将一个a,b,c,这样的字符输入int中会出现错误,而回车并没有出现这样的错误。但是在char中回车也是被当作字符了,还有,在scanf("%s")输入的时候,为什么回车没有被当作字符输入str中,而是被下一个字符b吃掉了。
//如果想用scanf输入字符串并且下一个是字符,一下是解决办法
# include <stdio.h>
int main (void)
{
char a;
char str[13333];
scanf("%s", str);
getchar();//俗称用getchar吃掉回车;
scanf("%c", &a);
printf("%s", str);
printf("%c", a);
return 0;
}
//与其用getchar吃掉回车,不如直接用gets输入字符串,就不需要getchar;
# include <stdio.h>
int main (void)
{
char a;
char str[13333];
gets(str);
scanf("%c" ,&a);
printf("%s", str);
printf("%c", a);
return 0;
}
写到这里,就可以总结这两种对于字符串输入的不同了:
gets并不被最后的回车干扰下一次的字符输入,但是用scanf输入字符串的时候,回车会被下一个字符输入当成字符储存。
同时,空格,换行符,回车都可以作为scanf的输入标准,当用sanf(“%s”)输入时,如果字符串中间有空格,就会出现一下结果:
# include <stdio.h>
int main (void)
{
char a;
char str[13333];
scanf("%s", str);
scanf("%c", &a);
printf("%s\n", str);
printf("%c\n", a);
printf("flag");
return 0;
}
这里的空格后面的字符串没了,而字符变量a接受的是空格,和上面用回车输入一样的。
而用gets可以解决这个问题:
# include <stdio.h>
int main (void)
{
char a;
char str[13333];
gets(str);
scanf("%c", &a);
printf("%s\n", str);
printf("%d\n", a);
return 0;
}
这里空格就真的被当作字符输入。
我在实验时候出现了一个新的问题,我不知道为什么,我这里亮一下:
# include <stdio.h>
int main (void)
{
char a;
char str[13333];
while(~scanf("%s", str))
{
scanf("%c", &a);
printf("%sflag\n", str);
printf("%cflag\n", a);
}
return 0;
}
从结果上看,每一次空格,都被字符变量a接受了,然后开始下一次循环,将空格之后的字符串作为下一次的循环输入while scanf中。
这是我在实验时意外发现的。