我刚刚开始学习C语言,如果您有更好的方法来了解以下内容,我会非常乐意帮助您清理/简化我的代码。
我想要一个程序来询问一个数字,如果找到了那么继续打印并结束,但是如果还有其他东西(例如一个字母键),那么我希望程序循环询问一个数字直到给出一个。
我开始使用一个简单的scanf输入命令,但当我试图检查是否有一个有效数字(我们定义它们)时,这似乎进入了一个无限循环。
所以相反,我最终得到了这个,从玩游戏/在线看,但我很想知道是否有更有效的方式!
//
// Name & Age Program
// Created by Ben Warren on 1/3/18.
//
#include <stdio.h>
int main (void)
{
//Setting up variables
int num;
char line[10]; /* this is for input */
//Collecting input
printf("Please enter any number? \t");
scanf("%d", &num);
//If Invalid input
while (num==0)
{
printf("\nTry again:\t");
fgets(line, 10, stdin); //turning input into line array
sscanf(line, "%d",&num); //scaning for number inside line and storing it as 'num'
if (num==0) printf("\nThat's not an number!");
}
//If Valid input
{
printf("\n%d is nice number, thank you! \n\n", num);
*}*
return 0;
}
答案 0 :(得分:3)
检查返回值,而不是检查值是否与0不同
sscanf
。它返回它所做的转换次数。在你的情况下,它应该是1.除非返回值是1,否则请继续询问一个数字。
#include <stdio.h>
int main(void)
{
int ret, num;
char line[1024];
do {
printf("Enter a number: ");
fflush(stdout);
if(fgets(line, sizeof line, stdin) == NULL)
{
fprintf(stderr, "Cannot read from stdin anymore\n");
return 1;
}
ret = sscanf(line, "%d", &num);
if(ret != 1)
fprintf(stderr, "That was not a number! Try again.\n");
} while(ret != 1);
printf("The number you entered is: %d\n", num);
return 0;
}
答案 1 :(得分:1)
对于C新手来说,这不是一个糟糕的方法。一个小的改进是实际检查scanf()
的返回值,因为它返回成功检索的参数数量。然后,您可以放弃依赖num
为0
来表明输入有效。除非您确实希望将0
明确标记为无效输入。
int ret = scanf("%d", &num);
ret == 1
意味着整数被成功地读入num
,ret == 0
意味着它不是。
答案 2 :(得分:1)
考虑使用strtol
来解析long int的字符串。这也允许您检测尾随字符。在此示例中,如果尾随字符不是换行符,则可以拒绝输入。 strtol
也可以检测溢出值。阅读文档以了解其工作原理。
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
//Setting up variables
long int num = 0;
char line[40] = ""; /* this is for input */
char *parsed = NULL;
printf("Please enter any number? \t");
fflush ( stdout);
while ( fgets(line, 40, stdin))
{
parsed = line;//set parsed to point to start of line
num = strtol ( line, &parsed, 10);
if ( parsed == line) {//if parsed equals start of line there was no integer
printf("Please enter a number? \t");
printf("\nTry again:\t");
fflush ( stdout);
continue;
}
if ( '\n' != *parsed) {//if the last character is not a newline reject the input
printf("Please enter only a number? \t");
printf("\nTry again:\t");
fflush ( stdout);
}
else {
break;
}
}
if ( !parsed || '\n' != *parsed) {
fprintf ( stderr, "problem fgets\n");
return 0;
}
printf("\n%ld is nice number, thank you! \n\n", num);
return 0;
}
答案 3 :(得分:0)
0(零)是一个数字......
但我明白你想做什么...... 您可以使用isdigit或类似功能的组合来检查有效号码
我认为遵循其他答案的建议也很重要,可以使用以下代码来使用scanf的返回值:
int ret = scanf("%d", &num);
并检查ret
是否成功或失败。