2017-09-13 73 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],它只輸出標準輸入的所有位置的最後輸入。我試着用普通的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

相關問題