查找字符串中的非整数
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 变量。
我正在尝试对命令行参数进行错误检查以确保它们是整数,但令人惊讶的是我很难做到这一点。这是我的一段代码,当所有命令行参数都是整数时,它可以工作。
程序可以向其中传递无限值。
一个例子:./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 变量。