Char没有转换为int

时间:2012-03-19 20:08:12

标签: c argv

由于某些原因,我的C程序拒绝将argv的元素转换为int,我无法弄清楚原因。

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 = argv [1]并首先使用转换来进行转换,这很奇怪,不管输入如何都给了我一个17。

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

4 个答案:

答案 0 :(得分:52)

尝试使用atoi(argv[1])(“ascii to int”)。

答案 1 :(得分: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

答案 2 :(得分:3)

您只是想将char*转换为int,这当然没有多大意义。您可能需要这样做:

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

然而,假设您的char*以“\ 0”结尾,它应该是,但可能不需要这样做。

答案 3 :(得分:2)

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

['5']['0']

当你施放

int i = (int) *argv[1]

你只是将第一个元素转换为int,这就是为什么你

您正在寻找的功能是Scott Hunter提到的atoi()strtol(),我更喜欢它,因为它的错误检测行为。