2017-09-13 6 views
1
#define OK 0 
#define MAXSTRING 200 
#define NUMBER 10 
#define MALLOC_ERROR 2 

int main(int argc, char** argv) { 

    char **B = (char**)malloc(sizeof(char*)*NUMBER); 
    char buffer[MAXSTRING]; 
    int i, strings = 0, arraysize = NUMBER; 

    if ((B = (char**)malloc(sizeof(char*)*NUMBER))==NULL) { 
     printf("initial malloc error\n"); 
     fflush(stdout); 
     exit(MALLOC_ERROR); 
    } 

    for(int i = 0; i< NUMBER; i++) { 
     B[i] = (char*)malloc(sizeof(char)*MAXSTRING); 
    } 
    while((fgets(buffer,MAXSTRING,stdin))!=NULL) { 
     /* 
      if(strings+1>arraysize) 
      { 
       arraysize = 2*arraysize; 
       B=realloc(B,(arraysize)*sizeof(char*)); 
      } 
     */ 
     buffer[strlen(buffer)-1]='\0'; 
     B[strings] = buffer; 
     printf("%s \n", buffer); 
     strings++; 
    } 


    printf("Read %d strings:\n", strings); 
    for (i = 0; i<strings ; i++) { 
     printf("\t%s\t %d\n", B[i], (int)strlen(B[i])); 
    } 
    return 0; 
} 

ループからB [i]を印刷しようとすると、すべての位置のstdinの最後の入力が出力されます。私は通常のforループでテストを試みましたが、何とか動作しますが、私は問題の原因を知りません。助けてくれてありがとう!!たとえば、最初の入力として「キリン」を入れ、別の入力「食べる」、最後の入力「葉」、B [i]のループだけが「葉」を出力しますchar配列が正常に動作しない(Cプログラミング)

+1

あなたの入力は何を動作するはず?あなたの出力は何ですか? _expected_の出力は何ですか?あなたの質問を編集して、それを明確にしてください。 –

+0

ありがとう。今strcpyで動作します。 :Dありがとうございました –

答えて

1

B[string] = bufferを実行すると、ポインタのコピーを作成するだけで、strcpy()を使うべきです。

あなたの文字列は常に終了\0であると仮定すると、そのようなことはstrcpy(B[i], buffer);

+0

ありがとう。それは今働く! :D –

+1

'strncpy'は固定長文字配列をコピーするためのものです。関数*は、そのフレークのゼロ終端動作について常に警告しなければならないことを示唆しています。これは問題のコードでは問題ではありませんが、後でコードが変更される場合があります。 – user694733

+0

確かに。 'strncpy'は危険な関数であり、使用すべきではありません。特に初心者にはお勧めできません。代わりに 'strcpy'または' memcpy'を使用してください。 https://stackoverflow.com/questions/2114896/why-are-strlcpy-and-strlcat-considered-insecure – Lundin

関連する問題