将字符从指针转换为整数num

时间:2018-05-04 12:17:57

标签: c

如果用户输入一个字符串,而不是用strtok保存它的每一部分,其中一个部分是数字,我怎么能把这个数字转换成整数? 我的目标是得到这个字符串:"矩阵3 3",并验证用户没有输入double或float,只是整数num。我试图做铸造,但它没有用 THX!

1 个答案:

答案 0 :(得分:0)

有不同的可能方式,但涉及

  

我的目标是[...]验证用户没有输入double或float,只是整数。

您可能希望获得完整的输入验证。在这种情况下,您必须使用strtol()

#include <stdlib.h>
#include <limits.h>

int main(void)
{
    const char *str = "42"; // in your code, some result from strtok

    char *endptr;
    long num = strtol(str, &endptr, 10);

    if (endptr == str || *endptr)
    {
        // not parsed successfully
        return 1; // error and out ... do whatever is suitable
    }
    if (num > INT_MAX || num < INT_MIN)
    {
        // value was outside int range
        return 1;
    }

    int x = (int)num;
    return 0;
}

如果您确实需要long来检查范围,请在致电errno之前将0设置为strtol(),然后再检查errno == ERANGE。 (包括errno.h

为了完整起见,作为回应to your comment,当然你可以手动完成所有操作,但这很乏味且容易出错并且效率低下,所以我从不推荐这样做。请在此处查看从字符串中解析无符号整数的示例,并进行错误检查:

#include <stdio.h>
#include <string.h>

// write result to *result, return 0 on error, 1 on success:
int parseuint(unsigned int *result, const char *str)
{
    if (!str || !*str) return 0;

    size_t len = strlen(str);
    unsigned char bcd[len];

    for (size_t i = 0; i < len; ++i)
    {
        if (str[i] < '0' || str[i] > '9') return 0;
        bcd[i] = str[i] - '0';
    }

    size_t scanstart = 0;
    *result = 0;
    unsigned int mask = 1;

    while (scanstart < len)
    {
        if (!mask) return 0;
        if (bcd[len-1] & 1) *result |= mask;
        mask <<=1;
        for (size_t i = len-1; i > scanstart; --i)
        {
            bcd[i] >>= 1;
            if (bcd[i-1] & 1) bcd[i] |= 8;
        }
        bcd[scanstart] >>= 1;
        while (scanstart < len && !bcd[scanstart]) ++scanstart;
        for (size_t i = scanstart; i < len; ++i)
        {
            if (bcd[i] > 7) bcd[i] -= 3;
        }
    }

    return 1;
}

int main(void)
{
    unsigned int a;

    if (parseuint(&a, "4258"))
    {
        printf("parsed: %u\n", a);
    }
    else
    {
        puts("error parsing 4258");
    }

    if (parseuint(&a, "13.7"))
    {
        printf("parsed: %u\n", a);
    }
    else
    {
        puts("error parsing 13.7");
    }

    if (parseuint(&a, "12345678901234567890"))
    {
        printf("parsed: %u\n", a);
    }
    else
    {
        puts("error parsing 12345678901234567890");
    }
}