scanf读入整形(int), 字符(char), 字符串的区别

1.scanf读入整形 (int)

 代码:  scanf("%d %d %d", &a, &b, &c);
输入: 1 2 3

  %d之间也可以不加空格  

 代码:  scanf("%d%d%d", &a, &b, &c);
输入: 1 2 3

因为:读入的是数字(不是字符),scanf()在读入数字时忽略  空格(字符) 和 换行符

实际输入: 1(空格)2(空格)3(空格)(换行)

但是:如果scanf 读入的是 字符 就会把空格,换行,当成一个字符

2.scanf读入字符(char)

先看一段代码

#include <stdio.h>

int main()
{
	char input = 0;

	while (scanf("%c", &input) != EOF)
	{
		if (('A' <= input && 'Z' >= input) || ('a' <= input && 'z' >= input))
		{
			printf("%c is an alphabet.\n", input);
		}
		else
		{
			printf("%c is not an alphabet.\n", input);
		}
	}

	return 0;
}

这段代码是想判断输入的字符是否是英文字母

是就输出%c is an alphabet.

否则输出%c is not an alphabet.

让我们看看实际运行结果 ↓ ↓

正常情况应该只会输出 : a is an alphabet 才对,那这又是什么原因呢??

解释 : 因为scanf 输入的是字符,而空格和换行 在scanf看来也是字符,所以刚才其实是输入了两个字符,a 和 换行符(\n)

实际输入 : a(\n)

所以程序一共循环了两次,第二次读入了‘\n’,并且打印出了  ‘\n’ is not an alphabet.  而‘\n'的作用是换行,所以没有显示出来,把 is not an alphabet 换到了第二行。

那正确的程序该怎么写呢??

#include <stdio.h>

int main()
{
	char input = 0;

	while (scanf("%c", &input) != EOF)
	{
		getchar();//读入一个字符
		if (('A' <= input && 'Z' >= input) || ('a' <= input && 'z' >= input))
		{
			printf("%c is an alphabet.\n", input);
		}
		else
		{
			printf("%c is not an alphabet.\n", input);
		}
	}
	return 0;
}

 int a = getchar();  getchar 读入一个字符,并且返回读入的字符放到a 里面

这里加入了 getchar()  来读取 ’\n' 相当于吸收了 ‘\n' 这样就避免scanf 读到 ’\n‘  问题就解决啦

 总结: scanf在读取字符时会把 空格 换行 一起读入,因为 空格 换行 也是字符,所以在使用时一定要注意,避免引起错误。

3.scanf读入字符串

scanf在读取字符串时要注意,scanf 不会读取空格,在遇到空格时就会停止,所以在用scanf读入字符串不要加空格

如果你想用scanf读入空格 可以用  scanf("%[^\n]",s) 来处理,^后面代表遇到'\n' 停止,你也可以将他换成其他符号,如scanf("%[^a]",s) 表示遇到a就停止读入

也可以使用 gets() 来读入字符串, gets是以回车结束读取,所以可以读取空格

好了,今天的内容就写到这里,如果觉得还不错可以点一个大大的赞 👍!!