2013-02-13 3 views
1

У меня есть следующий код, который хранит строковый ввод от пользователя N раз в многомерном массиве. А затем распечатайте второй элемент.Сохранение и извлечение строк в многомерном массиве

main() 
{ 

    // Array to store 10 strings, 20 characters long. 
    char strStorage[10][20]; 

    printf("\nEnter how many strings: "); 
    scanf("%d" , &num); 
    fflush(stdin); 

    for (count = 0 ; count < num ; count++) 
    { 
     printf("Enter a string: "); 
     gets(strStorage[count]); 
     fflush(stdin); 
    } 

    printf("%s", strStorage[2]); 

Последняя строка выводит мусор. Пользовательский вход не отображается внутри мусора, следовательно, мой доступ к элементу неверен или мое хранилище неверно. Может ли кто-нибудь помочь мне в отношении того, в чем проблема?

Заранее спасибо ...

+0

Что делать, если пользователь вводит более 19 символов? http://stackoverflow.com/questions/1694036/why-is-the-gets-function-is-dangerous-why-should-not-be-used – hmjd

+3

'fflush (stdin);' undefined behavior! –

+0

Каков ваш образец ввода? – Rohan

ответ

3

strStorage[2] является строка третьего, так что если num меньше , вы не инициализировать его, и он будет содержать мусор.

+0

Ну, им вводя 4 строки для тестирования, и это был все еще мусор. Даже strStorage [0] не работает – kype

+0

Я проверил ваш код в VS, используя отладчик, и проверил, что я утверждаю выше. Скорее всего, скопируйте * весь код программы *, который вы используете, и 4 строки, которые вы ввели, когда число было 4? Я бы это проверил. – kol

+0

Перезагрузила мою ОС, и теперь она работает. Спасибо за помощь. – kype

0

scanf("%d", &num); не гарантирует, что num содержит значение. Возможно, было бы разумно проверить возвращаемое значение scanf, чтобы убедиться, что оно читает значение 1, например: if (scanf("%d", &num) != 1) { puts("Error reading integer"); }

Пока мы находимся на этой теме, я предполагаю, что num и count объявлены как int, мы скрыли декларации от нас. Tsssk! Вы хотите нашу помощь? Если это так, сделайте свой код компилируемым! Вы действительно думаете, что int подходит для хранения индексов в массивах? Возможно, что они могут иметь отрицательные значения. Я бы предложил использовать size_t, а спецификатор формата %zu сообщает scanf ожидать значения size_t из stdin.

... и что происходит, когда этот size_t содержит значение, большее, чем количество элементов в вашем массиве? Я предлагаю исследовать массивы переменной длины.

fflush(stdin); - это бессмыслица, потому что fflush определяет поведение файлов, открытых для вывода, а stdin - это файл, открытый только для ввода. Это похоже на очистку туалета и ожидание отходов, выходящих из чаши, вместо того, чтобы спускаться по S-изгибу. Возможно, вы хотите отбросить оставшуюся часть строки, потому что вы прочитали данные, которые вам нужны с самого начала. Что-то вроде for (int c = getchar(); c >= 0 && c != '\n'; c = getchar()); может работать.

Не использовать gets. Вместо этого используйте fgets(strStorage[count], sizeof strStorage[count], stdin);, чтобы обеспечить отсутствие переполнения буфера.

Там, я думаю, я накрыл практически каждый бит неопределенного поведения и nit-picky stuffs.

Смежные вопросы