C 扫描终止程序
我正试图用C语言编写一个程序,将基数n转换为基数10。我有4个不包括main的函数:ObtainNumber、GetBase、ConvertNumberToBase10、GetMyExponential。我的主函数按以下顺序执行函数:GetBase、GetainNumber、GetMyExponential、ConvertNumberToBase10。我的程序同时运行GetBase函数和AcquinNumber函数。但是,我在AcquinNumber函数中使用了scanf函数,程序不会继续执行其他函数:C 扫描终止程序,c,C,我正试图用C语言编写一个程序,将基数n转换为基数10。我有4个不包括main的函数:ObtainNumber、GetBase、ConvertNumberToBase10、GetMyExponential。我的主函数按以下顺序执行函数:GetBase、GetainNumber、GetMyExponential、ConvertNumberToBase10。我的程序同时运行GetBase函数和AcquinNumber函数。但是,我在AcquinNumber函数中使用了scanf函数,程序不会继续执行其
long int ObtainNumber (long int myNumber)
{
scanf("%ld", &myNumber);
while (myNumber > 999999999)
{
printf("Error. Please enter a number with no greater than 9 digits\n");
scanf("%ld", &myNumber);
}
return (myNumber);
}
我想知道为什么会发生这种情况,以及如何修复它?函数返回类型为int
的结果,即成功扫描的项目数,或者如果出现错误,返回值EOF
。您应该始终检查结果,因为scanf()
可能由于程序无法控制的情况而失败
scanf(“%ld”,…)
将在跳过前导空格(包括换行符)后,读取具有可选带符号整数常量语法的文本。输入流中剩下的任何内容
如果看不到更多的代码和输入,就很难判断问题出在哪里
使用scanf
可能很棘手。更好的方法是使用fgets()
读取整行输入,然后使用sscanf()
解释其内容。通过使用fgets()
,您不会让部分输入行等待下一次调用(除非该行长于您的输入缓冲区),并且如果sscanf()
调用失败,它不会影响输入流的状态
注意,使用
fgets()
,而不是gets()
gets()
本质上是不安全的,不应该使用,并且已经从语言标准中删除。当你说程序不能继续执行其他功能时,你是什么意思?您知道,在调用scanf()时,它会等待用户通过stdin输入,对吗?如果不是这样的话,我们需要更多的细节和/或代码来帮助您。您是否考虑过在第一次失败后吃掉输入缓冲区中的换行符<代码>%ld“,例如?您没有检查scanf()的返回结果这一事实本身就是一个问题。它可能返回0,表示未分析任何值。的可能重复