scanf的两种输入方式
1)两个整数中间没有打逗号
#include<stdio.h>
int main()
{
int n=1,s=0;
printf("请输入n,s的值\n");
scanf_s("%d%d",&n,&s);
printf("%d", s);
}
可以看到我们输入的时候打了一个23就要打一个enter,再打入44,按一个enter才会输出s的值44
但是---------当我们在第一行输入2344,中间不加enter,系统就会默认n的值是2344,当我们第二次输入enter,再输入数字1的时候,s的值才是1【如下图】
这是因为:
在C语言中,scanf_s
函数用于从标准输入(通常是键盘)读取格式化的输入。当你调用 scanf_s("%d%d",&n,&s);
时,程序会暂停并等待用户输入两个整数,这两个整数之间可以用空格、制表符或其他空白字符分隔。
必须按下 Enter 键来表示输入的结束,这样 scanf_s
函数才能知道用户已经完成了输入,并且可以开始处理输入的数据。按下 Enter 键实际上是在输入流中插入了一个换行符,这个换行符告诉 scanf_s
用户已经结束了当前的输入。
这是标准输入函数的常见行为,按 Enter 是一种信号,告诉程序用户已经准备好提交输入,并且程序可以继续执行下一步操作。
2)两个整数中间打了逗号
#include<stdio.h>
int main()
{
int n=1,s=0;
printf("请输入n,s的值\n");
scanf_s("%d,%d",&n,&s);
printf("%d", s);
}
我们在输入的时候,需要手动打入一个逗号,才能完成n和s的输入【看下图】
但是如果我们不打一个逗号,而是输入一个enter,则该程序在执行之后s的值会是原来的0
这是因为:
scanf_s
函数的格式字符串 "%d,%d"
指定了输入的格式。这里的逗号意味着在输入两个整数值时,它们之间应该有一个逗号分隔。如果我们按照这个格式输入,比如 5,10
然后按 Enter,scanf_s
将会正确地读取 n
为 5
和 s
为 10
。
但是,如果你在输入 n
的值之后直接按 Enter 而不输入逗号和 s
的值,scanf_s
函数会因为没有找到符合格式字符串的输入而失败。这时,s
的值将不会被修改,保持它的默认值或者之前的值。
这是因为 scanf_s
和 scanf
函数都需要输入完全匹配格式字符串指定的格式。如果输入不匹配,它们会停止读取输入,并且后面的变量将不会被赋值。
如果你想要用户能够只通过空格分隔输入 n
和 s
的值,你应该去掉格式字符串中的逗号,像这样:
scanf_s("%d %d", &n, &s);
现在,用户可以输入 5 10
并按 Enter,scanf_s
将会读取 n
为 5
和 s
为 10
。如果用户只输入一个值然后按 Enter,scanf_s
会等待用户输入第二个值。
如何避免输入错误导致的程序崩溃
1)使用循环和条件语句来检查输入值是否在预期的范围内
int n;
int result = scanf_s("%d", &n);
if (result == 1) {
// 输入正确,继续程序
} else {
// 输入错误,可以提示用户重新输入
}
2)正确处理输入缓冲区
在C语言中,scanf
函数从标准输入(通常是键盘)读取数据时,会将数据存储在一个缓冲区中。这个缓冲区可以理解为一个临时存储区,它保存了用户输入的所有字符,直到按下 Enter 键。当 scanf
函数被调用时,它会从这个缓冲区中读取并处理数据,直到缓冲区为空或者满足了指定的格式要求。
如果在读取数据之前缓冲区中已经有了未处理的字符(比如之前的输入操作留下的换行符),scanf
会首先读取这些字符。这可能会导致一些意外的行为,尤其是在连续使用 scanf
读取多个数据时。
【例如】如果你使用 scanf("%d", &a);
读取一个整数,然后紧接着使用 scanf("%c", &b);
读取一个字符,那么 scanf("%c", &b)
可能会立即读取之前留在缓冲区中的换行符,而不是等待用户输入新的字符。
为了避免这种情况,你可以在两次 scanf
调用之间清空缓冲区。这可以通过多种方式实现,例如:
- 使用
fflush(stdin);
来清空输入缓冲区。但请注意,fflush(stdin);
- 使用
scanf("%*c");
来读取并丢弃缓冲区中的一个字符。 - 使用循环读取字符直到遇到换行符或文件结束符,例如:
while (getchar() != '\n' && getchar() != EOF)
【实例如下】
#include <stdio.h>
int main() {
char a;
while (scanf_s("%c" ,&a) != EOF) {
getchar();
printf("%c\n", a + 32);
}
return 0;
}
【写在最后】
本人是刚入门的小白一枚~文章多有不成熟之处欢迎各位大佬指正!