scanf与gets 对于字符串、字符、数的不同的输入情况。(傻孩子的第一次笔记)

# 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中。

这是我在实验时意外发现的。

发布了10 篇原创文章 · 获赞 1 · 访问量 166

猜你喜欢

转载自blog.csdn.net/weixin_45701902/article/details/102886393