2016-08-26 15 views
1

出力では、最後の文字は印刷されません。2次元文字配列

Input: 3 3 
     abcabcabc 
Expected Output: a b c a b c a b c 
Actual Output: a b c a b c a b 

cはどこですか?

#include <stdio.h> 
int main() { 
    int i,j,k,n; 
    char a[3][3],b[3][3]; 
    printf("enter size\n"); 
    scanf("%d %d",&n,&k); 
    printf("enter character \n"); 
    for(i=0;i<n;i++) 
     for(j=0;j<k;j++) 
      scanf("%c",&a[i][j]); 
    printf("\n"); 
    for(i=0;i<n;i++) 
     for(j=0;j<k;j++) 
      printf("%c ",a[i][j]); 
    return 0; 
} 
+0

「scanf」からの戻り値を常に確認してください。 'if(2!= scanf("%d%d "、&n、&k)){...エラー処理....}' – 4386427

答えて

5

このscanf()コール:

scanf("%d %d",&n,&k); 

を使用すると、ループ内の文字を読み取る場合、後続によって読み取られる入力バッファに改行文字(\n)を残します。そのため、入力が1つ少なくなります。

あなたは追加することができます。

int c; 
while((c = getchar()) != '\n' && c != EOF); 

scanf("%d %d",&n,&k);後はそれを無視します。しかし、一般的にはscanf()はそのような入力の読みには適していません。だから、あなたはfgets()を使った方が良いかもしれませんし、それを解析してください。 scanf関数により、入力バッファ内の前の改行文字(\ n)をクリアするWhy does everyone say not to use scanf? What should I use instead?

0
#include <stdio.h> 
int main() { 
    int i,j,k,n; 
    char a[3][3],b[3][3]; 
    printf("enter size\n"); 
    scanf("%d %d",&n,&k); 
    printf("enter character \n"); 
    fflush(stdin); 
    for(i=0;i<n;i++) 
     for(j=0;j<k;j++) 
      scanf("%c",&a[i][j]); 
    printf("\n"); 
    for(i=0;i<n;i++) 
     for(j=0;j<k;j++) 
      printf("%c ",a[i][j]); 
    return 0; 
} 

追加しましにfflush(STDIN):

関連します。