字符无法转换成整数

10

由于某种原因,我的C程序拒绝将argv中的元素转换为整数,我无法弄清原因。

int main(int argc, char *argv[])
{

    fprintf(stdout, "%s\n", argv[1]);

    //Make conversions to int
    int bufferquesize = (int)argv[1] - '0';

    fprintf(stdout, "%d\n", bufferquesize);
}

执行./test 50命令后的输出结果如下:

50

-1076276207

我尝试过去掉(int),在(int)和argv[1]之间加上*和&符号-前者给了我5但没有50,后者给出了类似于以上输出的结果。去除“-0”操作并没有帮助。我还尝试了创建一个char first = argv [1]并使用first进行转换,但不管输入什么都会得到17的奇怪结果。

我感到非常困惑。发生了什么事?


我认为你可能是指 argv[1][0](类型为 char) <-- 第一个参数的第一个字符(在执行文件名之后)。当然,这样做仍然没有进行检查,而且有更好的方法。不要试图“消除错误”(因为 argv[1] 的类型为 char*),因为它通常不起作用 :-) - user166390
4个回答

51

尝试使用atoi(argv[1])("ascii转int")。


10
这应该被选为最佳答案。 - RyanB
1
这里,atoi()函数就是为此而生的。 - Loi Huynh

12

argv[1] 是一个 char * 而不是一个 char,你不能将一个 char * 转换为 int。如果你想改变 argv[1] 中的第一个字符为 int 类型,你可以这样做。

int i = (int)(argv[1][0] - '0');

我刚写了这个

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char **argv) {
    printf("%s\n", argv[1]);

    int i = (int)(argv[1][0] - '0');

    printf("%d\n", i);
    return 0;
}

然后像这样运行它

./testargv 1243

并且得到了

1243
1

你为什么放弃了对atoi的引用? - FrankieTheKneeMan
@FrankieTheKneeMan 我从未使用过atoi。如果你想用的话可以使用它,但我的答案从未使用过它。Scott Hunter的答案使用了它。 - twain249
为什么你必须这样做 int i = (int)(argv[1][0] - '0'); 而不是 int i = (int)(argv[1][0]);?为什么需要 - '0' - nonsequiter
因为如果你的第一个字符是'1',在ASCII中1的值为49,所以强制转换会返回49。你需要减去第一个数字('0'在ASCII中的值为48),然后进行强制转换以获得正确的答案。 - pushkin

3

你只是试图将一个char*转换为整数,这当然没有太多意义。你可能需要这样做:

int bufferquesize = 0;
for (int i = 0; argv[1][i] != '\0'; ++i) {
   bufferquesize *= 10; bufferquesize += argv[1][i] - '0';
}

然而,这假设您的char*以'\0'结尾,虽然应该是这样,但可能不必如此。


1
实际上,它假设你的 char * 指向的 char 数组以 '\0' 结尾。指针是否以 '\0' 结尾(那意味着什么?它的表示以 0 字节结尾吗?)并不是问题。 - R.. GitHub STOP HELPING ICE
当然。句子“指向char的指针以某个符号结尾”没有意义。感谢您的纠正。 :) - Stefan Marinov

2

(type)存在于强制类型转换中——它可以改变程序中某个内存块的外观。具体来说,它读取字符'5'的字节编码并将其传输到内存中。char*是一个char数组,而chars是一字节无符号整数。 argv[1]指向第一个字符。在此处查看有关C指针的快速解释。here因此,您的“字符串”在内存中表示为:

['5']['0']

当你进行转换时,
int i = (int) *argv[1]

你只将第一个元素转换为int,所以你

你要找的函数是Scott Hunter提到的atoi(),或者我更喜欢的strtol(),因为它具有错误检测行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接