繁体   English   中英

C-无法读取用户整数输入

[英]C - Can't read user integer input

我正在尝试使用以下代码读取用户整数输入。 我知道strtol返回一个长值。

long color = 1;
char buf[256];
char * last;

while(color != 0){
    printf("Enter a color (0 to stop): ");
    fgets(buf, 256, stdin);

    color = strtol(buf, &last, 10);

    if(last != '\0'){
        printf("You didn't enter a number.\n");
    }
    else{
        printf("%d\n", color);
    }
}

我尝试运行此程序,首先输入4,这给了我You didn't enter a number. 我再次尝试了“四十”,并得到了相同的结果。 我在这里想念什么? 我要做的就是获取基本用户输入的整数值,该值验证仅输入了整数。 我不需要很长时间,因为这些值都在3000到4000之间。

if(last != '\\0')更改为if( *last != '\\0') 您想检查last 指向什么

https://linux.die.net/man/3/strtol

如果endptr不为NULL,则strtol()将第一个无效字符的地址存储在* endptr中。 如果根本没有数字,strtol()会将nptr的原始值存储在* endptr中(并返回0)。

特别是,如果返回时* nptr不是'\\ 0',而** endptr是'\\ 0',则整个字符串都是有效的。

last != '\\0'等同于last != NULL 您正在测试last是否是空指针,而从来没有,因为strtol从未将*endptr设置为NULL

您可能应该这样做:

if (last == buf || *last != '\0')

(第一个条件处理buf是空字符串的情况。)

输入代码中存在第二个问题:

fgets(buf, 256, stdin);

该行不会检查fgets的返回值以确保buf已被填充,并且不会删除任何用户输入的结尾换行符。

改为这样做:

if (!fgets(buf, 256, stdin)) {
    break;
}
buf[strcspn(buf, "\n")] = '\0';

至于为什么'\\0'在这里充当空指针:

如果在指针上下文中使用,则任何值为零的整数常量表达式都会隐式转换为空指针。 '\\0'是一个零值整数表达式,您正在将其与指针进行比较,因此它位于指针上下文中。

对于OP的特定情况,测试数字后是否有多余的非数字文本就足够了。

char buf[256];

if (fgets(buf, sizeof buf, stdin)) Handle_EndOfFile();
char *last;
long color = strtol(buf, &last, 10);

while (isspace(*last)) last++; // tolerate trailing white-space like '\n'

// Do not compare the pointer, compare what it points to
// if(last != '\0'){
if (*last || color < 3000 || color > 4000) {
  Handle_NonNumeric("You didn't enter a number in 3000-4000 range.\n");
} else {
  foo(color); // Success
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM