[英]Adding rows to a 2D array and assigning values to it is giving wrong results
[英]2d array giving wrong output
在用戶完成輸入字符串並提及每個字符串的最大長度和總數字符串后,我正在編寫代碼來打印存儲在 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
請糾正我在哪里做錯了。
您遇到了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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.