变量从atoi分配C中丢失它的值

问题描述 投票:-2回答:1

我是C族新手,所以请放轻松!

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

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

当我将新变量声明为= atoi(argv [1])时;并打印以确认一切正常。

然后我的代码执行其他一些看似无关的操作,当我再次打印变量时,该值为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:");

int n = strlen(msg[0]); //after this point variable 'key' value is 0 unless I redeclare it
c command-line cs50 atoi
1个回答
1
投票

问题是您在msg数组的边界之外编写。

string msg[0];

声明一个没有元素的数组。因此,分配给任何元素都会在其外部写入,从而导致未定义的行为。当您分配

时会发生这种情况
msg[0] = get_string("text:");

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

string msg[10];

您可以通过msg[0]分配给msg[9]

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