【问题标题】:Int parameter in argv[]argv[] 中的 int 参数
【发布时间】:2021-10-10 04:24:53
【问题描述】:

所以基本上我把这个项目带到了学校,我们需要将int 参数传递给argv[]。该项目在 C. 我们不能使用string.h

我尝试将argv[] 重新输入为int,但由于它只是一个指针,它不起作用。

这是我的代码:

if(argv[1][0] == '1'){
            printf("Hodnota LEVEL je 1");

       } 
       else if(argv[1][0] == '2'){
           printf("Hodnota LEVEL je 2");

       }

如您所见,我目前正在检查 argv[] 是否等于 char '1' 或 '2' 这不是我想要的。

我想到的唯一一件事就是用一些 char 变量替换“1”和“2”,然后将其重新转换为 int。在这个过程之后,我可以检查它是int 1 还是int 2

还有其他方法可以解决我的问题吗?

【问题讨论】:

  • 也许使用strtol()(原型在<stdlib.h>):int arg1 = strtol(argv[1], NULL, 10);
  • 您可以使用argv[1][0] - '0' 将单个字符串数字转换为int。如果数字可以有多个数字,则使用循环和简单的数学来形成完整的整数。
  • nit:string.h 不是库。它是一个标题。确保您了解其中的区别。

标签: c casting arguments argv


【解决方案1】:

如果你不允许使用标准库,那么你可以这样做:

int val = 0;
for ( char *p = argv[1]; *p != 0; p++ )
{
  val *= 10;
  val += *p - '0’;
}

保证十进制数字的字符编码是连续的,因此减去 '0' 的编码可以得到等效的整数值 - 例如,'1' - '0' == 1'2' - '0' == 2 等。

您可能想要添加某种验证 - 如果argv[1] == "abcd",您会得到一个有趣的结果。

如果您被允许使用标准库,请改用strtol

【讨论】:

  • 谢谢,但请您解释一下,为什么在那段代码中有这一行:val *= 10;
  • @DomHofman : 因为如果你有“21”,那么 Val 是第一个 2,然后你乘以 10 得到 20 并加 1。如果你有 3,4,则继续,... 数字
  • 哦,我明白了,谢谢你的解释。
  • @DomHofman:请注意,我发布的代码中有一个非常重要(而且很愚蠢)的错误,我刚刚更正了它。我正在检查p == NULL,这是不正确的——我不是在寻找空指针,而是在寻找字符串终止符。正确的检查现已到位。
猜你喜欢
  • 2014-10-26
  • 2013-09-08
  • 2014-01-10
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
相关资源
最近更新 更多