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是以回车结束读取,所以可以读取空格
好了,今天的内容就写到这里,如果觉得还不错可以点一个大大的赞 👍!!