Как поместить строки из файла в массив в c

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

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]);

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

Все ли строки в файле одинаковой длины?

Susmit Agrawal 23.11.2018 19:25

Без предоставления содержимого файла на вопрос нельзя ответить. Пожалуйста, предоставьте входные данные, с которыми вы пробовали код.

Géza Török 23.11.2018 19:25

Я просто проверил это на файле, содержащем "a b c"

madmax007 23.11.2018 19:30

Пожалуйста, предоставьте весь код.

Susmit Agrawal 23.11.2018 19:32

Весь код не нужен; пока это не минимальный воспроизводимый пример, но довольно близко. Но, @ madmax007, ваше объявление vararray было бы полезно.

wizzwizz4 23.11.2018 19:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
732
2

Ответы 2

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

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
}

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

вы делаете что-то слишком неправильно. По "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]);
}

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

Другие вопросы по теме