Pisałem kod do drukowania wszystkich ciągów przechowywanych w tablicy 2d po tym, jak użytkownik zakończył wpisywanie ciągów wraz z podaniem maksymalnej długości każdego ciągu i całkowitej liczby ciągów (w końcu wydrukuje ciąg wraz z numerem wiersza). Problem polega na tym, że kod faktycznie przechowuje wszystkie ciągi w tablicy 2d z jednym pełnym odstępem, tj. jednym pełnym pustym wierszem. Kod, oczekiwany wynik i wynik, który daje, znajduje się poniżej.

Kod:

#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;
}

Przykładowe dane wejściowe:

2 3
raj
jar

Oczekiwany wynik:

i= 0   raj
i= 1   jar 

Podawanie wyników:

i= 0   

i= 1   raj
i= 2    

i= 3   jar

Proszę o sprostowanie, gdzie popełniam błąd.

1
Kaustav Bhattacharjee 12 listopad 2018, 10:57

1 odpowiedź

Najlepsza odpowiedź

Natrafiłeś na jeden z wielu problemów z scanf. W tym przypadku scanf("%d %d", ...) pozostawia znak nowej linii w buforze. Możesz zmusić go do siorbania w końcowej białej spacji ze spacją na końcu.

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

Zatem sposób, w jaki czytasz linię, jest skomplikowany. Możesz to uprościć tak:

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

Albo jeszcze prościej...

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

I nie ma potrzeby length_of_string. W rzeczywistości jest to odpowiedzialność, ponieważ przydzieliłeś tylko 30 bajtów maksymalnie. Podobnie, number_of_strings może być wyższy niż przydzielone 20. Lepiej jest czytać do wyczerpania danych wejściowych lub pamięci.

#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;      
}
1
Schwern 12 listopad 2018, 11:17