我需要将数字字符数组转换为整数值,以便在 C 中执行数学运算。当我使用 atoi(argv[2][count]) 时,它只将第一个数字转换为整数。因此,如果 argv[2]=123,它只会将“1”转换为整数 1。我怎样才能让“123”成为一个整数值 123?谢谢!
2 回答
atoi 是一个很好的函数,但是您可以在 C 中编写自己的 atoi 函数。
int xatoi(char *s)
{
int result=0;
while(*s)
{
result=result*10+(*s-48);
s++;
}
return result;
这背后的逻辑是每个字符'1','2',......的ascii值被存储例如'1'具有ASCII值'49'。请编译上面的程序并检查我没有测试过的错误,但我相信它会工作。
请参阅下面的链接以供参考 http://www.newebgroup.com/rod/newillusions/ascii.htm
argv
是一个字符串数组的数组,因此argv[N]
为您提供了一个数组。但是为您提供存储在数组argv[N][J]
位置的元素。但是,奇怪的是编译器没有抱怨您的代码,因为函数实际上需要一个指针(指向以空字符结尾的字符串)而不是字符值。编译器应该说类似. 我建议您不要忽略警告。就我个人而言,我倾向于编译具有最高警告级别的代码并且没有一个警告,尽管我们工作的代码库是数百万行代码。J
argv[N]
atoi()
warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast
另外,更喜欢使用strtol
over atoi
。问题atoi
在于它忽略了无效输入(即,如果没有问题,则只返回 0,而不影响errno
)。
无论如何,这是一个如何从命令行获取基数为 10 的整数数组的示例:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
int n;
char *e;
int *v;
if (argc < 2) {
fprintf(stderr, "Please specify some numbers\n");
return EXIT_FAILURE;
}
n = argc - 1;
v = alloca(sizeof(int) * n);
for (i = 1; i < argc; ++i) {
v[i-1] = strtol(argv[i][i], &e, 10);
if (!v && errno) {
fprintf(stderr, "Cannot convert '%s' into number: %s\n",
argv[i], strerror(errno));
return EXIT_FAILURE;
} else if (*e != '\0') {
fprintf(stderr, "%s is not a number\n", argv[i]);
return EXIT_FAILURE;
}
}
printf("You have entered the following numbers: %d", v[0]);
for (i = 1; i < n; ++i)
printf(", %d", v[i]);
printf("\n");
return EXIT_SUCCESS;
}
希望它是有用的。