查找字符串中的非整数

Finding non-integer in a string

我正在尝试对命令行参数进行错误检查以确保它们是整数,但令人惊讶的是我很难做到这一点。这是我的一段代码,当所有命令行参数都是整数时,它可以工作。

程序可以向其中传递无限值。
一个例子:./program -p 45 67 3 9 1

for (argCounter = 2; argCounter < argc; argCounter++) 
{
    total = total * atoi(argv[argCounter]);
}

当用户键入 5g 时会发生什么? atoi() 将其转换为 5。我需要将其转换为 return 一个错误。出于某种原因,我也无法让 isdigit() 正常工作。我尝试了很多随机的事情,以至于我的头在这一点上旋转。所以我想做的是:

    for (argCounter = 2; argCounter < argc; argCounter++) 
    {
        //pseudocode
        if (argv[argCounter] != integer)
        {
              printf("Error!");
              return 0;
        } 

        total = total * atoi(argv[argCounter]);
    }

您可以使用 sscanf()。它的 %n 占位符可用于确定消耗的字符数,您可以将其与字符串长度进行比较:

for (argCounter = 2; argCounter < argc; argCounter++) 
{
    int value, consumed;

    if ((sscanf(argv[argCounter], "%d%n", &value, &consumed) != 1) ||
        (argv[argCounter][consumed] != '[=10=]'))
    {
        printf("Error!");
        return 0;
    } 

    total *= value;
}

或者,您可以使用 strtol()。它可以输出指向第一个未解析字符的指针。您可以检查该字符是否为空终止符:

for (argCounter = 2; argCounter < argc; argCounter++) 
{
    char *end;

    errno = 0;
    long value = strtol(argv[argCounter], &end, 10);

    if ((end == argv[argCounter]) ||
        (*end != '[=11=]') ||
        (((value == LONG_MIN) || (value == LONG_MAX)) && (errno == ERANGE)))
    {
        printf("Error!");
        return 0;
    } 

    total *= value;
}

好吧,我是个初学者,我不太明白你到底想做什么? 如果我理解,您想检查所有参数是否都是包含在整数范围内的数字(仅数字),您希望总计包含所有这些整数的乘积(并且我假设您还希望总计在整数范围内? )

long long total = 1;
for (argCounter = 1; argCounter < argc; argCounter++) 
{
    char *check_end;
    long long nbr = stroll(arg[argCounter], &check_end, 10);
    if (!argv[argCounter][0]|| *check_end || nbr > INT_MAX || nbr < INT_MIN || nbr * total > INT_MAX || nbr * total < INT_MIN)
    {
        total = 0;
        printf("Error\n");
        break;
    }
    total *= nbr;
}

也许这应该有所帮助,漫步将基数(作为第三个参数给出)中的字符串(作为第一个参数给出)转换为 long long 并将字符串的指针(作为第二个参数给出)设置到该位置在转换停止的字符串上([=12=] 如果只有符号后的数字)你可以检查漫步者;无论如何,我不确定我的代码是否经过优化或实用,您可能希望在最后获得一个 int,因此将 int total 变量转换为 int 变量。