【问题标题】:C - Storing main() arguments in an arrayC - 将 main() 参数存储在数组中
【发布时间】:2016-01-15 18:55:06
【问题描述】:

我正在使用银行家算法创建一个多线程程序,对所有程序进行硬编码和编译,但我在从用户输入中填充初始 available 数组时遇到问题

#DEFINE NUMBER_OF_RESOURCES 3

int available[NUMER_OF_RESOURCES];       //available will be length of argc i.i number of total resoruces

int main(int argc, char *argv[]) 
{

printf("AVAILABLE RESOURCE: \n [");
//Populate Available Resource Array
for (i = 1; i < argc; i++)
{
    available[i-1] = argv[i];
    printf("%d ", available[i]);
}
printf("] \n\n");
}

执行时: ./a.out 10 7 5

打印出来:

[1604031496 1604031499 1604031501 ] 

【问题讨论】:

  • argv 的元素是字符串,而不是数字。用%s 打印它们,而不是%d
  • available 变量的类型是什么?
  • available[i-1] = atoi(argv[i]); printf("%d ", available[i-1]);
  • 您正在尝试将字符串指针打印为整数。 argv[] 是一个指针数组。从您给出的数字来看,很可能第一个参数的长度为 2(大小为 3),而下一个参数的长度为 1(大小为 2)。

标签: c main argv argc


【解决方案1】:

你不能通过普通的赋值将字符串转换为整数(你应该得到一个编译器警告,关于在没有强制转换的情况下将char* 分配给int)。调用atoi()解析整数。

available[i-1] = atoi(argv[i]);

【讨论】:

  • 如果编译器使用 32 位指针,您可能不会收到错误,这可能是您真正想要做的。
  • @TheTromboneWilly 指针的大小无关紧要,它们仍然是不同的类型。任何体面的编译器都应该警告这样的自动转换。
  • 要解析外部输入,请使用strtol 而不是atoi
【解决方案2】:
  1. 使用atoi 将字符串转换为int
  2. 确保您没有越界访问available
for (i = 1; i < argc && i < NUMER_OF_RESOURCES+1; i++)
{
    available[i-1] = atoi(argv[i]);
    printf("%d ", available[i-1]);
}

【讨论】:

  • 你的意思是i-1吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 2017-12-21
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
相关资源
最近更新 更多