如何阻止字符串替换以前的元素?

How to stop string from replacing previous elements?

我正在尝试 运行 这个程序,该程序读取 str:int:int:int 类型的输入,然后将值拆分到各自的数组中。问题是每次函数 运行s 时字符串部分都会被替换。这是我的代码:

 int main(){
        char *str[100];
        int stock[100][3],idp=0;

        while(idp<100){
          fgets(data,80,stdin);
          str[idp]=strtok(data,":");
          stock[idp][0]=atoi(strtok(NULL,":"));
          stock[idp][1]=atoi(strtok(NULL,":"));
          stock[idp][2]=atoi(strtok(NULL,":"));
          idp++;
        }
    return 0;
    }

运行使用输入 abc:3:4:5 abcde:1:5:6 def:5:6:7while() 循环 3 次后,我得到以下值:

str[0]=def stock[0][0]=3 stock[0][1]=4 stock[0][2]=5
str[1]=def stock[1][0]=1 stock[1][1]=5 stock[1][2]=6
str[2]=def stock[2][0]=5 stock[2][1]=6 stock[2][2]=7

如您所见,虽然 stock[][] 数组的值已正确存储,但 str[] 数组中的所有先前字符串都已被替换。我想知道如何阻止这种情况发生。提前致谢。

在这些陈述中

      fgets(data,80,stdin);
      str[idp]=strtok(data,":");

指针str[idp] 总是设置为同一变量数据中的地址。所以变量在当前时刻存储的是指针指向的内容。

您必须复制指向的字符串。

那就是你需要声明一个二维字符数组,例如

char str[100][10];

然后写例如

strcpy( str[idp], strtok(data,":") );

你在做浅拷贝。你需要真正的副本。一种方法是使 str 成为类似于 char str[100][80] 的二维数组。然后代替这个

str[idp]=strtok(data,":");

这样做

strcpy(str[idp], strtok(data,":"));

此外,如果您的输入完全是那种格式,您可以使用 sscanf 而不是 atois 和 strcpy。像这样

sscanf(data, "%[^:]:%d:%d:%d", str[idp], &stock[idp][0], &stock[idp][1], &stock[idp][2]);

%[^:] 将读取非 :.

的字符