2017-11-21 13 views
0
#include <stdio.h> 
#include <string.h> 

int text(char*); 

int main() 
{ 
    char n[5][100] = {'c'}; 

    char (*p)[100] = n; 

    text(*p); 

    return 0; 
} 

int text(char *p) 
{ 
    for(int i = 0; i<5; i++) 
    { 
     scanf("%s", p+i); 
    } 

    printf("%s", (p+2)); 

    return 0; 
} 

したがって、2D文字配列のポインタを使用して完全な文字列を出力する必要があります。 2次元配列を宣言し、2次元配列を宣言しました。 それから機能テストに渡します。ポインタを使用した2次元文字配列からの文字列

私は(p + 2)を印刷すると、3行目を印刷すると思います。しかし、それは3行目から最後の行までの各行の最初の文字と最後の行全体を出力します。

間違いは何ですか?

+1

関数int text(char *); 2D配列へのポインタを受け付けません。 1次元配列の最初の文字へのポインタを受け取ります。 –

答えて

2

関数は、charchar *への単一のポインタしか取らない。あなたの関数に引数を渡す、あなたは間接参照あなたの2D配列は:

text(*p); 

これはあなただけ(この場合は最初の行には)最初の要素を渡すことを意味します。

pは、単一のcharへのポインタであるため、p+2は3文字目になります。

は何をする必要がある正しいタイプを使用することです。そして、

text(p); // <- no dereference! 

int text(char (*p)[100]); 

呼び出し、それは、あなたの関数では、あなたが例えば記述し

printf("%s", p[2]); 

またはポインタ算術演算の構文を使用する場合は、

printf("%s", *(p+2)); 
関連する問題