Программа выводит странные символы, даже если строка заканчивается нулем - PullRequest
3 голосов
/ 30 декабря 2011

Я пишу программу для чтения стандартного ввода и вывода его.

int main() {
    FILE* inputF = stdin;
    char* inputStr[10];

    fread(inputStr, 1, 9, inputF);
    if(ferror(inputF)) {
        printf("An error occurred");
        return 0;
    }

    inputStr[9] = '\0';

    printf("%s", (const char*)inputStr);

    return 0;
}

Он должен создать строку длиной 10 символов и прочитать в нее 9 байтов стандартного ввода, а затем поместить '\0' в положение 9.

Когда я запускаю программу, это результат:

gab@testvm:~/work/c/fibo$ ./a.out < test.txt
56                                                                                                     `ô
                                                                                                       ga

Печатаются две строки и лишние символы (прокрутите вправо, чтобы увидеть их).

Что может быть причиной этого?

Ответы [ 3 ]

9 голосов
/ 30 декабря 2011

inputStr не является строкой,

char* inputStr[10];

это массив из 10 char *. Вы должны изменить объявление на char inputStr[10];.

2 голосов
/ 30 декабря 2011

@ DanielFischer указал на вашу непосредственную проблему, однако, как только вы исправите проблему char[] против char*[], вы должны также заметить ...

Если test.txt содержит менее 9 символов, то между последним прочитанным символом и позицией, в которой вы пишете нулевой терминатор, все равно останутся ненужные символы.

Вам следует проверить возвращаемое значение fread, чтобы увидеть, сколько символов было прочитано, и написать нулевой терминатор в соответствующем месте.

1 голос
/ 30 декабря 2011
#include <stdio.h>

int main(void) 
{
    FILE* inputF = stdin;
    char inputStr[10];

    fread(inputStr, 1, 9, inputF);

    inputStr[9] = '\0';
    printf("%s \n", inputStr);

    return 0;
}

$ gcc run.c 
$ ./a.out 
123456789
123456789 
$ 

Вам нужно либо char a[], либо char *, но не char *a[]

Приведенный выше фрагмент кода неполон, так как в нем отсутствует проверка ошибок, проверка ввода и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...