2d массив дает неправильный вывод - PullRequest
0 голосов
/ 12 ноября 2018

Я писал код для печати всех строк, хранящихся в 2d-массиве, после того, как пользователь закончил вводить строки, а также указывал максимальную длину каждой строки и общее количество строк (в итоге она будет печатать строку вместе с номером строки),Проблема заключается в том, что код на самом деле хранит все строки в массиве 2d с одной целой строкой, то есть с одной пустой строкой.Код, ожидаемый вывод и вывод, который он дает, приведены ниже.

Код:

#include <stdio.h>

int main() {
    char s[20][30];
    int i, number_of_strings, length_of_string, j = 0;
    scanf("%d %d", &number_of_strings, &length_of_string);

    for (i = 0; i<number_of_strings; i++) {
        while ((s[i][j++] = getchar()) != '\n' && j<length_of_string)
            s[i][j] = '\0';
        j = 0;
    }

    for (i = 0; i<number_of_strings; i++) {
        printf("i= %d   %s\n", i, s[i]);
    }

    return 0;
}

Пример ввода:

2 3
raj
jar

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

i= 0   raj
i= 1   jar 

Выходные данные:

i= 0   

i= 1   raj
i= 2    

i= 3   jar

Пожалуйста, исправьте, где я делаю ошибку.

1 Ответ

0 голосов
/ 12 ноября 2018

Вы нажали одну из многих проблем с scanf.В этом случае scanf("%d %d", ...) оставляет новую строку в буфере.Вы можете заставить его хлебать в конце пробела с пробелом в конце.

scanf("%d %d ", &number_of_strings , &length_of_string); 

Тогда то, как вы читаете строку, сложно.Вы можете упростить это так:

 int c, j;
 for(j = 0; (c = getchar()) != '\n'; j++ ) {
     s[i][j] = (char)c;
 }
 s[i][j] = '\0';

Или даже проще ...

for(int i=0 ; i<number_of_strings ; i++) {
    scanf("%29s", s[i]);
}

И length_of_string не требуется.На самом деле, это ответственность, так как вы выделили максимум 30 байт.Точно так же number_of_strings может быть выше выделенного 20. Лучше читать, пока не будет исчерпан ввод или память.

#include <stdio.h>

const int MAX_STRINGS = 20;
const int MAX_LENGTH = 30;
int main(){ 
    char s[MAX_STRINGS][MAX_LENGTH];
    int num_strings;
    for(num_strings = 0; num_strings < MAX_STRINGS ; num_strings++) {
        if( scanf("%29s", s[num_strings]) < 1 ) {
            break;
        }
    }

    for( int i = 0 ; i < num_strings; i++){                                                                               
        printf("i= %d   %s\n",i,s[i]);
    }

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