C语言|scanf输入函数

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 然后按 Enterscanf_s 将会正确地读取 n 为 5 和 s 为 10

但是,如果你在输入 n 的值之后直接按 Enter 而不输入逗号和 s 的值,scanf_s 函数会因为没有找到符合格式字符串的输入而失败。这时,s 的值将不会被修改,保持它的默认值或者之前的值。

这是因为 scanf_s 和 scanf 函数都需要输入完全匹配格式字符串指定的格式。如果输入不匹配,它们会停止读取输入,并且后面的变量将不会被赋值。

如果你想要用户能够只通过空格分隔输入 n 和 s 的值,你应该去掉格式字符串中的逗号,像这样:

scanf_s("%d %d", &n, &s);

现在,用户可以输入 5 10 并按 Enterscanf_s 将会读取 n 为 5 和 s 为 10。如果用户只输入一个值然后按 Enterscanf_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;
}


【写在最后】

本人是刚入门的小白一枚~文章多有不成熟之处欢迎各位大佬指正! 

  • 39
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值