为何使用scanf处理时间输入时分钟值未正确存入C语言变量?
scanf抑制输入冒号失败,分钟变量值异常的问题分析
你的问题出在scanf格式串的语法错误上,以下是具体分析和修正方案:
先看你提供的代码与测试场景:
#include<stdio.h> #include<string.h> void main() { int hours_var,minutes_var; printf("Whats the time??\n"); scanf("%d*c%d",&hours_var,&minutes_var); printf("%d\n", hours_var); printf("%d\n",minutes_var); }
测试输入:
2:24
输出:
Whats the time?? 2:24 2 0
错误原因
你想用*c抑制冒号的输入,但scanf的抑制赋值修饰符必须和%配合使用,正确写法是%*c。你写的%d*c%d中,*c会被当成普通字符匹配规则:scanf读取完第一个整数2后,会尝试匹配输入中的*字符,但你输入的是:,匹配失败,导致后续的%d完全没有执行读取操作,minutes_var保持未初始化的默认值(此处恰好为0)。
修正方案
把格式串改成"%d%*c%d",这样%*c会读取并跳过一个任意字符(这里就是冒号),然后正常读取分钟数:
#include<stdio.h> #include<string.h> void main() { int hours_var,minutes_var; printf("Whats the time??\n"); scanf("%d%*c%d",&hours_var,&minutes_var); printf("%d\n", hours_var); printf("%d\n",minutes_var); }
如果想更严谨,明确只跳过冒号(避免误跳过其他无关字符),可以写成"%d%*1[:]%d",或者直接用"%d:%d"(这种写法无需抑制符,直接匹配冒号,效果一致)。
测试结果
输入2:24后,输出会变为:
Whats the time?? 2:24 2 24
内容的提问来源于stack exchange,提问作者yashwanth
相关产品推荐
相关产品推荐

