#c #unix #malloc #segmentation-fault #text-processing
#c #unix #malloc #ошибка сегментации #обработка текста
Вопрос:
ОТРЕДАКТИРУЙТЕ, чтобы включить предложения в код и обновить вопрос
Я должен реализовать функцию переноса слов в программе и выбрал жадный алгоритм
//I use fread to take in the file in one bite, the parse the resulting array. The
//four lines below are from another function.
char *readBuffer= (char *) malloc(sizeof(char) * fileSize);
int size= ftell(fp);
rewind(fp);
size_t result= fread(readBuffer, 1, size, fp);
int spaceLeft= termWidth;
int outputLines=0, tempLength, printCount-0;
char *temp, *newLine="n";
temp= strtok(readBuffer, " "),
fputs(temp, stdout); //prints out a 11, when should be a 1, then exits
while ((outputLines < termHeight) amp;amp; (temp != NULL)){
strcat(temp, " ");
tempLength= strlen(temp);
if (spaceLeft > tempLength){
fputs(temp, stdout);
spaceLeft -= tempLength 1;
} else {
strcat(newLine, temp);
spaceLeft= termWidth-(tempLength);
outputLines ;
newLines="n";
}
temp= strtok(NULL, " ");
printCount = tempLength //debugger display
}
}
С помощью этого кода я проверил, что файл был правильно считан в ReadBuffer с помощью
fputs(readBuffer, stdout)
команда. Однако первый fputs выводит на экран значение 11, хотя оно должно быть равно 1. Затем он пропускает цикл while и завершает работу.
OutputLines имеет значение 0, а termHeight является результатом termHeight=termios.ws_row-1
вызова.
Если temp выводит значение на экран, и (outputLines= 0) > termHeight, как temp может быть нулевым в этом случае?
Комментарии:
1.
strtok
вернетnull
, если в строке больше нет токенов, может быть, это то, что происходит?2. Так я и думал, но размер файла составляет 1,6 КБ, и в нем содержится примерно 90 строк текста. Почему это должно возвращать значение null? если я вывожу текст через
fputs
withoutstrtok
, отображается весь текст.3. Содержит ли файл какие-либо символы NUL (») в нем? Это помешало бы
strtok()
.
Ответ №1:
Частично проблема может заключаться в том, что fgets
извлекается только одна строка из файла. Страница руководства описывает это. Похоже, что код ожидает, что он прочитает весь файл. Таким образом, temp будет равен нулю после обработки этой первой строки (одиночный токен, если в нем нет пробелов).
Не зная длины текста, который вы читаете, ни значений termHeight
или termWidth
, невозможно узнать путь выполнения. Но ошибка segfault, вероятно, возникает при strlen()
вызове нулевого temp
значения после обработки этой строки. Хотя это не полное исправление, в while
инструкции, вероятно, следует использовать amp;amp;
вместо ||
:
while ((outputLines > termHeight) amp;amp; (temp != NULL){
И в зависимости от того, как вы хотите это обработать, вам может потребоваться еще один fgets
вызов для чтения следующей строки после strtok
возврата NULL. Или, альтернативно, используйте fread
для извлечения всего файла за один вызов.