Символы мусора при чтении файла с помощью fgetc - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь прочитать текстовый файл в кодировке UTF-8 с помощью fgetc и разделить каждую строку на слова. Я добавляю каждый символ в строку, пока не увижу пробел, и это будет слово. Но каждый раз, когда я читаю символ и strcat, что, к моему слову, я получаю некоторые значения мусора. Любое понимание того, почему я получаю их и как я могу удалить их?

`CHAR читается как T

WORD T �T] qcU

CHAR читается как h

WORD T �T] qcU h �x] qcU

CHAR читается как e

WORD T • 1/2 T] qCU ч •½x] qcU e •½x] qcU `

РЕДАКТИРОВАНИЕ:

    char c;
    char *string = malloc(1);

    do
    {
        c = fgetc(fptr);

        printf("CHAR read %c\n", c);

        if (c == ' ' || c == '\r' || c == '\n')
        {
            //do something with the word()
            free(string);
            string = malloc(1);

        }
        else
        {
            strcat(string, &c);
            string = realloc(string, sizeof(string) * strlen(string) + 1);

        }

    } // while !EOF

    //free string

}

1 Ответ

0 голосов
/ 15 октября 2019

Это недопустимо:

strcat(string, &c);

Второй параметр strcat, как ожидается, будет указателем на завершенную нулем строку. Но вместо этого вы передаете адрес одного символа. В результате strcat будет читать за пределами памяти c, ища байт со значением 0. Это вызывает неопределенное поведение .

Вместо этого следите за числомсимволов в string и скопируйте новый символ до конца. Затем, когда вы закончите, добавьте завершающий нулевой байт, чтобы сделать его правильной строкой.

char c;
char *string = malloc(1);
string[0] = 0;
int len = 0;

do
{
    c = fgetc(fptr);

    printf("CHAR read %c\n", c);

    if (c == ' ' || c == '\r' || c == '\n')
    {
        //do something with the word()
        free(string);
        len = 0;
        string = malloc(1);
        string[0] = 0;
    } else {
        string[len++] = c;
        string = realloc(string, len + 1);
        string[len] = 0;
    }
} // while !EOF
...