2017-09-13 74 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

相关问题