首页 > 解决方案 > 变量从 atoi 赋值中丢失它的值

问题描述

我是 C 的新手。

我试图从命令行参数中获取一个数字,并在整个代码中的多个计算中使用它。命令行中输入的数字显然是作为字符串返回的,因此我试图将其转换为数字以避免使用 char 产生的所有计算错误。

我没有学过 atoi 或 stdlib.h,所以我什至不确定这是我应该如何解决这个问题,但这是我能找到将字符串转换为数字的唯一方法。

当我声明一个新变量as = atoi(argv[1]);并打印它以验证一切似乎都很好。

然后我的代码执行了一些其他看似不相关的操作,当我再次 printf 我的变量时,值为 0。我不明白为什么当我不重新声明变量时值会发生变化,但这意味着接下来的任何计算都不会工作。

任何想法我做错了什么?

编辑:如果我直接将'key'声明为整数,则程序没有问题,当我尝试从数组中提取整数时问题就来了。{ 在 main() 之后,但它不会在帖子中格式化。

int main(int argc, string argv[]) {
  string msg[0];
  int key = atoi(argv[1]);  
  if (argc != 2) {
    printf("This function requires one command line argument: key\n");
    return 1;
  }

  if (key < 1) {
    printf("error\n"); 
    return 1;
  }

  // At this point variable 'key' is ok and equals the value entered in command line
  msg[0] = get_string("text:");

  // After this point variable 'key' value is 0 unless I redeclare it
  int n = strlen(msg[0]); 

标签: ccommand-linecs50

解决方案


问题是您在msg数组范围之外编写。

string msg[0];

声明一个没有元素的数组。所以分配给任何元素都会写在它外面,导致未定义的行为。当您分配时会发生这种情况

msg[0] = get_string("text:");

您需要使用要存储在其中的实际最大元素数来声明数组。如果您将其声明为

string msg[10];

您可以msg[0]通过msg[9].


推荐阅读