Странное поведение printf с массивом при передаче указателя на другую функцию - PullRequest
0 голосов
/ 07 ноября 2019

Чтобы подготовиться к экзамену, мы пытаемся выполнить некоторые упражнения из прошлых экзаменов. В этом упражнении мы получаем заголовочный файл и должны создать функцию, которая считывает входной файл и печатает на стандартный вывод только те строки строк, которые не содержат цифр. (Мы должны передать указатель строки red на основную функцию). Мы пытались сделать это с помощью массива, но при печати первое слово пустое или содержит странные символы. Вместо этого выполнение распределения malloc работает нормально. Что также странно, так это то, что печать перед всеми пустыми строками исправит код.

Поэтому мы не понимаем, почему при использовании массива char первое слово печатается неправильно, хотя оно сохраняется в буфере.

Включение printf перед циклом while в основной функции решит проблему.

Использование динамического выделения (malloc) и не статического выделения (массив) исправит печать.

Итерации по всему массиву и установка всей памяти в 0 не решают проблему.

Следовательно, указатель правильный, так как при печати пустой строки он печатает его правильно, но я действительно не могу понять, почемупроблема.

Вопрос:

  1. Как при печати пустой строки печать будет правильной?
  2. Массив расположен в стеке, поэтому онКогда программа выходит из области видимости, освобождается только первое слово, а не все слова?
#include "word_reader.h"
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

const char * read_next_word(FILE * f) {

    char buffer[WORD_MAX_LEN];
    char * word = buffer;
    for (int i = 0; i < WORD_MAX_LEN; ++i)
        buffer[i] = 0;
    //char * buffer = malloc(sizeof(char) * WORD_MAX_LEN);
    int found = 0;
    int c = 0;
    int i = 0;

    while (!found && c != EOF) {
        while ((c = fgetc(f)) != EOF && isalpha(c)) {
            found = 1;
            buffer[i] = c;
            ++i;
        }
        buffer[i] = '\0';
    }
    if (found) {
        return word;
        //return buffer; // when use malloc
    }
    return 0;
}

int main(int argc, char * argv[]) {
    FILE * f = fopen(argv[1], "r");
    if(!f) { 
        perror(argv[1]);
        return EXIT_FAILURE; 
    }

    const char * word = 0;
    //printf(""); // adding this line fix the problem
    while ((word = read_next_word(f))) {
        printf("%s\n", word);

    }
    fclose(f);
    return 0;
}

заголовок файлаФайл содержит только объявление read_next_word и определяет WORD_MAX_LEN для 1024. (Также включите

файл для чтения (простой .txt файл)

ciao234 44242 toro
12Tiz23 where333
WEvo23

ожидаемый результат:

ciao
toro
Tiz
where
WEvo

фактический результат

�rǫs+)co�0�*�E�L�mзx�<�/��d�c�q
toro
Tiz
where
WEvo

первая строка всегда содержит символы ascii или пустую строку.

...