2016-12-28 4 views
0

私はプログラミングの初心者です。 Iは2次元配列に(文字の)行を削除するには、この簡単なコードを記述します。私はそれをコンパイル2D配列の行(文字)を `strcpy`で削除するとエラーはありますか?

#include <stdio.h> 
#include <string.h> 

#define M_RW 100 
#define M_CH 100 

void ArrIn (char a[][M_CH], int &n) 
{ 
    for (int i = 0; i < n; i++) 
    { 
     printf("a[%d] = ", i); 
     gets(a[i]); 
    } 

} 

void ArrOut (char a[][M_CH], int n) 
{ 
    for (int i = 0; i < n; i++) 
    { 
     printf("a[%d] = %s\n", i, a[i]); 
    } 
} 


void ArrDel (char a[][M_CH], int &n, int position) 
{ 
    for (int i = position; i < n - 1 ; i++) 
    { 
     strcpy(a[i+1], a[i]); 
    } 

    n--; 
} 

void main() 
{ 

    char a[M_RW][M_CH]; 
    int n, k; 

    printf("Number of row: n = "); scanf("%d", &n); 
    fflush(stdin); 
    printf("\n---\n\n"); 
    ArrIn(a, n); 
    printf("\n---\n\n"); 
    ArrOut(a, n); 
    printf("\n---\n\n"); 
    printf("Want to delete row: k = "); scanf("%d", &k); 
    fflush(stdin); 
    ArrDel(a, n, k); 
    printf("\n---\n\n"); 
    ArrOut(a, n); 
    printf("\n---\n\n"); 

} 

後、私は、入力データの一部:

+ n = 5; 

+ a[0] = "Careless whisper"; 
+ a[1] = "I feel so unsure"; 
+ a[2] = "As I take your hand"; 
+ a[3] = "And lead you to the dance floor"; 
+ a[4] = "..."; 

+ k = 2; 

私はこのように、結果見てみたいです。

+ a[0] = Careless whisper 
+ a[1] = I feel so unsure 
+ a[2] = And lead you to the dance floor 
+ a[3] = ... 

しかし、それが返されます。

+ a[0] = Careless whisper 
+ a[1] = I feel so unsure 
+ a[2] = I feel so unsure 
+ a[3] = I feel so unsure 

なぜa[1]何回ループするのか分かりません。


私にあなたを教えてください:strcpyを使用すると間違っていますか?

+0

'fflushは(標準入力)は'未定義の動作 –

+0

'INT&N 'は、有効なCの構文ではありません呼び出します。参照引数はC++でのみ存在します。 – Barmar

+0

参照渡しは、C言語では機能しません。 – haccks

答えて

4

問題は、strcpy()への引数があることです。構文はstrcpy(destination, source)あるので、あなたは

strcpy(a[i+1], a[i]); 

を書くとき、あなたはその上で、その後a[3]次の反復a[4]に、最初の反復でa[3]a[2]からのコピー、およびています。したがって、配列の残りのすべてのエントリにa[2]がコピーされます。

変更し、それに:

strcpy(a[i], a[i+1]); 
関連する問題