#c
#c
Вопрос:
Будучи новичком в C, я пытаюсь прочитать файл из нескольких слов, используя косвенное обращение bash, и поместить слова в массив string. Конец файла отмечен знаком -1.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void init(char* words[]);
int main(int argc,char *argv[]){
char* words[400000];
init(words);
int i = 0;
do{
printf("%s",words[i]);
i ;
}while(!strcmp(words[i],"-1"));
}
void init(char* words[]){ // initializes array
int i = 0;
do{
fgets(words[i],1024,stdin);
i ;
}while(!strcmp(words[i],"-1"));
}
Это приводит к ошибке сегментации, если потребуется какая-либо другая информация, я более чем рад ее предоставить.
Комментарии:
1. Вы не указали место для
fgets
размещения входных данных. Память не выделяется сама по себе.2.
char* words[400000]
создает 400000 указателей , указывающих в никуда. Вы должны выделить для них память, прежде чем читать строки в случайных местах, на которые указывают эти указатели3. Дэвид Райхерт, какой компилятор C вы используете?
4. @chux Я использую GCC
5. Попробуйте
gcc -pedantic -Wall -Wextra -Wconversion -c ...
получить быструю информативную обратную связь. (Предупреждения) Быстрее, чем публикация здесь.
Ответ №1:
Если я правильно догадался, ‘400000’ означает максимальное количество строк, которые может ввести пользователь. Но размер стека по умолчанию в ОС Windows равен 1 м, sizeof(void*) * 400000 = 1,600,000…
Другое дело, что вы не выделили память для каждой строки.
Итак, я пытаюсь исправить ваш код следующим образом:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LINE 4000 // '400000' is really too big!
void init(char* words[]);
int main(int argc,char *argv[]){
char* words[MAX_LINE];
memset(words, 0 , sizeof(words));
init(words);
int i = 0;
do{
printf("%s",words[i]);
delete words[i];
words[i] = nullptr;
i ;
}while(!strcmp(words[i],"-1"));
}
void init(char* words[]){ // initializes array
int maxLen = 1024;
int i = 0;
do{
words[i] = new char[maxLen];
memset(words[i], 0, maxLen);
fgets(words[i], maxLen, stdin);
i ;
}while(!strcmp(words[i],"-1") amp;amp; i < MAX_LINE);
}
Комментарии:
1.
new char[maxLen];
— это недопустимое выражение в C. Вопрос касается C, а не C .2. @KamilCuk Вы правы, измените new / delete на malloc / free, чтобы исправить требования C, пожалуйста.