【问题标题】:Converting char * to int with strtol only if it's a valid number仅当它是有效数字时才使用 strtol 将 char * 转换为 int
【发布时间】:2019-12-08 15:45:14
【问题描述】:

我尝试使用strtolchar* 转换为int

long lnum;
int num;
char *end;

char * str ="3a";
lnum = strtol(str, &end, 10);

printf(" res = %d \n" , lnum);

此代码打印3

我怎么知道输入不仅仅是数字?我希望此转换失败,因为 "3a" 包含一个 'a' 字符。

【问题讨论】:

  • @user3121023 为什么 end 必须是 char ** 而不是 char*

标签: c validation strtol


【解决方案1】:

我想到的快速解决方案是检查结尾是否为\0,这意味着字符串是空的,所以所有原始字符串都是一个数字

【讨论】:

  • 为什么我不能检查if (*end != NULL ) ? end 是 char ** 所以 *endchar * ,为什么我不能和 NULL 比较?
  • 是的,你可以比较一下,我建议也这样做,但是 C 中好的字符串应该以 "\0" 结尾
【解决方案2】:

你可以比较 *end 和 NULL

if (*end != NULL)
{
    printf("failed");
}

【讨论】:

  • NULL 是一个指针,不应与字符进行比较。 *end != '\0' 明确表明您正在与字符串末尾的 0 字节进行比较,*end != 0 甚至只是 *end 也可以。
  • end is char ** to *end is char * ,为什么不能和NULL比较?
  • 在计算机编程中,null 既是值又是指针。 Null 是一个值为零的内置常量。和 C 中用来终止字符串的字符 0 一样。Null 也可以是指针的值,所以 NULL 不仅仅与指针有关
  • @joifdoi:在您的代码中,end 是一个指针,您将其地址传递给strtol,它存储了源字符串中数字后面的第一个字符的地址。
【解决方案3】:

如果你想通过溢出和语法检查将字符串转换为int,你必须在代码中使用额外的测试:

  • 检查溢出
  • 检查多余的字符
  • 检查 int 范围的结果

这是修改后的版本:

#include <errno.h>
#include <limit.h>
#include <stdlib.h>

int convert_str(const char *str) {
    long lnum;
    int num;
    char *end;

    errno = 0;
    lnum = strtol(str, &end, 10);
    if (errno || *end != '\0' || lnum < INT_MIN || lnum > INT_MAX) {
        printf("invalid input: %s\n", input)
        return 0;
    } else {
        num = lnum;
        printf("res = %d\n" , num);
        return num;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2014-06-24
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多