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 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;
}
Podobne pytania
Nowe pytania
c
C jest językiem programowania ogólnego przeznaczenia, używanym do programowania systemów (system operacyjny i systemy wbudowane), bibliotek, gier i wielu platform. Ten znacznik powinien być używany w przypadku ogólnych pytań dotyczących języka C, zgodnie z definicją w standardzie ISO 9899 (najnowsza wersja 9899: 2018, chyba że określono inaczej - również oznaczanie żądań dotyczących wersji za pomocą c89, c99, c11 itd.). C różni się od C ++ i nie należy go łączyć ze znacznikiem C ++ bez racjonalnego powodu.