Как поместить строки из файла в массив в c - PullRequest
0 голосов
/ 23 ноября 2018

Итак, у меня есть этот код:

char inte[10];
    while(j<noinput) {
            fscanf(circuit,"%s",inte);
            vararray[count]=inte;
            count++;
            j++;
    }

Однако, когда я печатаю содержимое массива следующим образом:

for (h=0;h<noinput+2;h++){
            printf("%dth variable: %s\n",h,vararray[h]);
    }

Элементы после первых двух (которые зарезервированы дляспециальные элементы) все равны последней строке, которую я взял из fscanf ранее.Я понятия не имею, как одна из строк из fscanf может быть равна нескольким слотам в массиве, когда я устанавливаю

vararray[count]=inte;

Разве это не означает, что каждый элемент массива будет отличаться, так как яувеличиваю счет каждый раз?Я так растерялся.Я также попытался сделать:

 fscanf(circuit,"%s",vararray[count]);

Но это также не сработало и дало мне нулевые элементы для определенных индексов.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

вы делаете что-то слишком неправильно."Vararray [count] = inte;"вы делаете присваивание указателя, поэтому весь ваш vararray заполняется одной и той же строкой.Я предполагаю, что вы новичок в C, поэтому я отвечу из-за этого.Правильный путь будет выглядеть примерно так:

Решение с фиксированным размером:

char vararray[ROWCOUNT][BUFFERSIZE];
for(count=0; j<noinput; ++count, ++j) {
    fscanf(circuit,"%s",(char*)vararray[count]);
}

С динамическим управлением памятью

char * vararray[ROWCOUNT];
for(count=0; j<noinput; ++count, ++j) {
    vararray[count] = (char*)malloc(BUFSIZE);
    fscanf(circuit,"%s", vararray[count]);
}

Я хочу предупредить вас о том, как статьв настоящее время эксперт по Си - это безумие, я имею в виду, если у вас нет другого выбора.Приведенные ниже примеры и то, что вы написали, совершенно небезопасно и небезопасно ...

0 голосов
/ 23 ноября 2018

Вы не копируете строку.Вот что происходит:

char *vararray[462]; // declare an array of string pointers
char inte[10];       // declare a char array (to function as a string)

for (int i = 0; i < 462; i += 1) {
    // do something
    vararray[i] = inte;
}

Это приводит к тому, что все элементы vararray указывают на память, также называемую inte ... но вы перезаписываете это каждый раз!Вместо этого сделайте что-то вроде этого:

#include <string.h>  // write me at the top, outside main()!

char vararray[462][10]; // declare an array of strings (max length 9)
char inte[10];       // declare a char array (to function as a string)

for (int i = 0; i < 462; i += 1) {
    fscanf(circuit,"%10s",inte);  // use buffer size to make xscanf safer
    strncpy(vararray[i], inte, 9);  // copy inte, making sure not to buffer overflow!
    vararray[i][9] = '\0';  // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
}

Это скопирует строку!Ваша проблема должна исчезнуть, когда вы сделаете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...