【问题标题】:Char isn't converting to intChar 没有转换为 int
【发布时间】:2012-03-19 20:08:11
【问题描述】:

由于某种原因,我的 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*),因为它通常不起作用:-)

标签: c argv


【解决方案1】:

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

【讨论】:

  • 这应该是选择的答案。
  • 就在这里。 atoi() 函数就是为此而生的。
【解决方案2】:

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 我从未使用过 atoi。如果你愿意,你可以使用它,但我的回答从来没有。 Scott Hunter 的回答使用了它。
  • 为什么你必须使用int i = (int)(argv[1][0] - '0'); 而不是int i = (int)(argv[1][0]);?为什么- '0' 是必要的?
  • 因为如果你的第一个字符是'1',ascii 中的 1 是 49,所以转换会返回 49。你想减去第一个数字(ascii 中的'0'是 48),然后投以获得正确的答案。
【解决方案3】:

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

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

不过,这假定您的 char* 以 '\0' 结尾,它应该这样做,但可能不必这样做。

【讨论】:

  • 实际上它假设chars 你的char *指向的数组'\0'结尾。指针“是否以 '\0' 结尾(这意味着什么?它的表示以 0 字节结尾?)不是问题。
  • 当然。 “指向char 的指针以某个符号结尾”这句话毫无意义。谢谢你的纠正。 :)
【解决方案4】:

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

['5']['0']

当你施放时

int i = (int) *argv[1]

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

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

【讨论】:

    猜你喜欢
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多