Невозможно распечатать массив строк без получения мусорных символов - PullRequest
0 голосов
/ 11 октября 2010
int main(int argc, char** argv) {
    char *test[5][20];
    char *input[20];
    int i;
    for(i=0;i<5;i++){

    printf("enter> ");
    fflush ( stdout );
    fgets(input,20,stdin);
         *test[i] = *input;
    }

    for(i=0;i<5;i++)
       printf("%d | %s\n",i,test[i]);
    return 0;
}

Выход:

enter> pwd

enter> pathd

enter> ls

enter> echo $ path

введите> pwd 0 |pwd

1 |путь▒] a▒▒a▒▒ # a▒▒ 2 |ls

3 |echo▒▒ (4 | pwd

Нажмите [Enter], чтобы закрыть терминал ...

Мне также нужно иметь возможность читать данные ввода с пробелами. Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 октября 2010

Используйте memcpy(). И вам нужно убрать завершающие символы новой строки. Здесь:

#include <stdio.h>
#include <string.h>

void chopnl(char *s) {              //strip '\n'
    s[strcspn(s, "\n")] = '\0';
}

int main() {
    char test[5][20];
    char input[20];
    int i;
    for(i=0;i<5;i++){
        printf("enter> ");
        fflush ( stdout );
        fgets(input, 20, stdin);
        chopnl(input);
        memcpy(test[i], input, strlen(input)+1);//test[i] = input;
    }
    for(i=0;i<5;i++)
       printf("%d | %s\n",i,test[i]);
    return 0;
}
1 голос
/ 11 октября 2010

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

Ввод - это массив указателей на символы - или для этой цели - массив строк.То, что вы делаете, читает 20 символов на входе, где вход в этом выражении fgets действует как адрес первого элемента массива.Итак, вы читаете 20 символов из стандартного ввода в 20 указателей ввода на символы.Это не то, что вы хотите.Вы хотите прочитать символы в строку для строки.

Я предполагаю, что вы компилируете с использованием GCC - рассмотрите возможность использования -Wall, чтобы GCC предупреждала вас о проблемах типа.

Другая проблема

*test[i] = *input;

Так как это похоже на домашнюю работу, я чувствую, что дал достаточно подробностей.

0 голосов
/ 06 июля 2014

Я знаю, что на этот вопрос дан ответ, и он очень старый, но принятое решение на самом деле неверно. Если вы введете более 19 символов, то stdin останется с байтами, которые будут прочитаны на следующих fgets (), и он найдет новую строку, а следующая запись будет неправильной.

См. Следующий код и обратите внимание на несколько вещей:

- Вам не нужен отдельный буфер для чтения ваших входных данных. Просто прочитайте прямо в массив.

- После чтения в массив удалите '\n'

- При необходимости промыть stdin

#include <stdio.h>
#include <string.h>

int main()
{
    char test[5][20+1] = {{0}};     // extra space for NULL
    int i;
    int c;
    char *ptr = NULL;

    for(i=0;i<5;i++){
        printf("enter> ");
        fgets(test[i], 20+1, stdin);    // fgets read n-1 characters so we add 1 since our buffer has space for null already
        if( (ptr = strrchr(test[i], '\n') ) )
        {
            *ptr = 0x00;
        }
        else
        {
            // need to flush stdin since '\n' wasn't found fgets() didn't read all of input
            while( (c = getchar()) != '\n' && c != EOF );       
        }
    }

    for(i=0;i<5;i++)
       printf("%d | %s\n",i,test[i]);

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