Как остановить строку от замены предыдущих элементов? - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь запустить эту программу, которая читает ввод типа str:int:int:int, а затем разбивает значения на соответствующие массивы. Проблема в том, что строковая часть постоянно заменяется при каждом запуске функции. Это мой код:

 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;
    }

После выполнения цикла while() 3 раза с входами abc:3:4:5 abcde:1:5:6 def:5:6:7 я получаю следующие значения:

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[] заменяются. Я хотел бы знать, как остановить это. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Вы делаете мелкие копии. Вам нужны настоящие копии. Один из способов - сделать str двумерным массивом, подобным char str[100][80]. Тогда вместо этого

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

сделайте это

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

Кроме того, если вы используете строго такой формат, вы можете использовать sscanf вместо atoi s и strcpy. Вот так

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

%[^:] будет читать символы, которые не :.

1 голос
/ 29 марта 2020

В этих операторах

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

указатели str[idp] всегда устанавливаются на адреса внутри одних и тех же переменных данных. Так что переменная хранит в текущий момент, на что указывают указатели.

Вы должны сделать копии заостренных строк.

То есть вам нужно объявить двумерный массив символов liek, например

char str[100][10];

, а затем написать для пример

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