转换字符在C诠释,然后在printf值INT?

问题描述 投票:2回答:3

我一直当我运行的代码获得这些奇怪的负值。有谁知道它们是什么,以及如何得到的只是一个int(例如10,20,8 ...)?为什么我总是得到一个不同的错误值?当我运行参数2的代码和3它应该输出10 ...

int main(int argc, char *argv[]) {
  int h;
  int a;
  int b;
  a = (int) argv[1];
  b = (int) argv[2];
  if (argc == 3) {
    h = 2 * (a + b);
    printf("The perimeter of the rectangle is %d\n", h);
  } else {
    fprintf(stderr, "Usage: %s <arguments>\n", argv[0]);
  }
}

Output:
The perimeter of the rectangle is -1874251136
or
The perimeter of the rectangle is -1424723328
or
The perimeter of the rectangle is -940059169
c int
3个回答
3
投票

测试为时已晚

if(argc==3){测试所需argc,但使用后argv[1], argv[2]不幸。之前移动测试并退出如果没有需要。注:良好的使用错误信息来stderr

if (argc != 3) {
  fprintf(stderr,"Usage: %s <arguments>\n", argv[0]);
  return -1; // or return EXIT_FAILURE
}  

不正确的转换

代码转换的指针,而不是引用的文本。

#include <stdlib.h>

// a = (int)argv[1];
a = atoi(argv[1]);

健壮的代码将使用strtol()或者是推出自己的`strtoi()'


2
投票

argv是指针char的阵列。即这是一个字符串数组。字符串"1"不等于整数1(或甚至字符'1')。你正在做一个铸件的事实应该几乎总是一面红旗。

将一个字符串转换为数字使用strtol功能。

永远记住访问argc前检查argv


1
投票
b = (int)argv[2]

(int)是指针值的铸 - 它只是转换类型

相反,尝试使用atoistrtol将字符串转换为整数值。

© www.soinside.com 2019 - 2024. All rights reserved.