【问题标题】:How to cast program argument *char as int correctly?如何正确地将程序参数 *char 转换为 int?
【发布时间】:2010-12-01 12:34:19
【问题描述】:

我在 Mac OS X 10.6.5 上使用 XCode 3.2.1 64 位构建 C 命令行工具,构建配置为 10.6 |调试 | x86_64。我想传递一个正偶整数作为参数,所以我将 argv 的索引 1 转换为 int。这似乎可行,但似乎我的程序正在获取 ascii 值而不是读取整个 char 数组并转换为 int 值。当我输入“progname 10”时,它告诉我输入了 49,这也是我输入“progname 1”时得到的结果。如何让 C 将整个 char 数组作为 int 值读取? Google 只向我展示了 (int)*charPointer,但显然这不起作用。

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

int main(int argc, char **argv) {
    char *programName = getProgramName(argv[0]); // gets the name of itself as the executable
    if (argc < 2) {
        showUsage(programName);
        return 0;
    }
    int theNumber = (int)*argv[1];
    printf("Entered [%d]", theNumber);            // entering 10 or 1 outputs [49], entering 9 outputs [57]
    if (theNumber % 2 != 0 || theNumber < 1) {
        showUsage(programName);
        return 0;
    }

    ...

}

【问题讨论】:

    标签: c pointers casting char


    【解决方案1】:

    argv 数组中的数字是字符串表示形式。您需要将其转换为整数。

    sscanf

    int num;
    sscanf (argv[1],"%d",&num);
    

    atoi()(如果有)

    【讨论】:

      【解决方案2】:

      铸造做不到,你需要实际解析文本表示并转换为整数。

      这方面的经典函数称为@987654321@,但也有@987654322@ 甚至@987654323@

      【讨论】:

      • 永远不要使用atoi(),它可能不可用,并且它会no进行任何错误检查:stackoverflow.com/questions/2729460/…
      • @Ivo,atoi 由 C 标准指定,因此很可能无处不在。它确实进行了错误检查,只是以一种无益的方式报告它(为零)。 strtol 是一个更好的函数,除了快速一次性代码,它更难使用。
      【解决方案3】:

      假设您有一个 9 作为参数。你说你得到了 57,即 ascii 值。

      使用int num = *arg[1] - '0' 将返回您需要的号码这一事实。

      如果是更大的数字,比如 572,那么你需要

      char *p = argv[1];
      int nr = 0;
      int i;
      for(i =0; i< strlen(p); i++) {
          nr = 10 * nr + p[i] - '0';
      }
      

      添加一些错误检查,这很好。

      或者,根据你所拥有的,你可以使用一些函数,如 atoi()、sscanf() 等。

      【讨论】:

        【解决方案4】:

        使用atoi()strol() 函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 2019-09-10
          • 2017-03-21
          • 2015-03-18
          • 1970-01-01
          • 2011-04-09
          • 2018-05-15
          相关资源
          最近更新 更多