【问题标题】:Atoi Function does not Convert Letters ProperlyAtoi 函数无法正确转换字母
【发布时间】:2020-02-08 23:40:04
【问题描述】:
 printf("Enter a number or type 'Exit' to exit\n");

    long val = 0;
    int y = 3;

    scanf("%s", input);

    val = atoi(input); 


    if (val < y) {

       printf("Hey You!");

    }
    else {
        printf("Error, no such cell exists.\n");
    }

当用户输入“0”、“1”或“2”时,会打印“Hey You”。但是,当用户输入任何字母(例如“y”或“k”)时,也会打印“Hey You”。如何确保仅针对低于 3(即 y)的值打印“Hey You”。

【问题讨论】:

  • atoi 函数返回 0 表示转换失败。如果您想区分0y,则必须使用不同的函数,例如strtol
  • 是否需要atoi()
  • n = scanf("%ld", &amp;val)n == 1 检查应该非常简单
  • atoi() 是一个遗留函数,从那时起错误处理不像今天那么重要。它在解析错误时返回 0,因此您无法将返回值与有效文字 0 区分开来。如果您需要错误控制,那么最好使用sscanf(3)strtoi(3),正如其他 cmets 中所建议的那样。

标签: c scanf atoi


【解决方案1】:

来自 C 标准

如果结果的值无法表示,则 行为未定义。

可以返回任何值。在您的情况下,此值低于 3。但不能保证。

atoi不返回任何特殊值,如果不能进行转换,不设置任何错误变量

【讨论】:

    【解决方案2】:

    你在哪里定义了input?您是否已经为要存储的字符串分配了内存?如果不是,您可能会遇到分段错误或atoi 可能会返回0

    根据atoi (https://en.cppreference.com/w/cpp/string/byte/atoi) 上的文档,如果字符串中有多余的非数字符号,它将忽略它们,如果没有,它将返回0

    【讨论】:

    • C++ != C 不要混用它们,尤其是在你回答问题时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多