如何在C中将char附加到动态分配内存的字符串中?

时间:2018-10-01 18:30:49

标签: c string realloc

我写了这段代码,但是在字符串的开头插入了垃圾:

void append(char *s, char c) {
    int len = strlen(s);
    s[len] = c;
    s[len + 1] = '\0';
}

int main(void) {
    char c, *s;
    int i = 0;
    s = malloc(sizeof(char));
    while ((c = getchar()) != '\n') {
        i++;
        s = realloc(s, i * sizeof(char));
        append(s, c);
    }   
    printf("\n%s",s);   
}

我该怎么办?

3 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题:

  • 您进行迭代,直到从标准输入流中读取换行符(return await)。如果文件结尾在读取换行符之前发生,这将导致无限循环,如果从空文件重定向标准输入,则将发生这种情况。
  • '\n'应该定义为c,以便您可以正确测试int
  • EOF始终应为null终止,您必须将s之后的第一个字节设置为'\0',因为此函数不会初始化它分配的内存。
  • malloc()应该初始化为i,以便第一个1将数组扩展1,以此类推。根据编码,数组太短了一个字节,无法容纳额外的字符。
  • 您应该检查内存分配失败。
  • 为了保持良好的风格,您应该在退出程序之前释放分配的内存
  • realloc()应该返回main(),最好返回int以取得成功。

这是更正的版本:

0

答案 1 :(得分:0)

当您调用strlen时,它将搜索'\0'字符以结束字符串。您的字符串中没有这个字符,这是因为strlen的行为是不可预测的。 您的append功能非常好。 另外,您需要在主函数中添加return 0;。并且i应该从1开始,而不是0。 这是它的外观:

int main(void){
   char *s;
   size_t i = 1;
   s = malloc (i * sizeof(char));//Just for fun. The i is not needed.
   if(s == NULL) {
   fprintf(stderr, "Coul'd not allocate enough memory");
   return 1;
   }
   s[0] = '\0';
   for(char c = getchar(); c != '\n' && c != EOF; c = getchar()) {//it is not needed in this case to store the result as an int.
      i++;
      s = realloc (s,i * sizeof(char) );
      if(s == NULL) {
             fprintf(stderr, "Coul'd not allocate enough memory");
             return 1;
      }
      append (s,c);
    }   
printf("%s\n",s);   
return 0;
}

感谢帮助我改进代码的注释(以及我的英语)。我并不完美:)

答案 2 :(得分:0)

内部 <mat-selection-list> <ng-container *ngFor="let facilityDetailsType of facilityDetailsTypes"> <mat-list-option> {{facilityDetailsType | translate}} <div *ngIf="facilityDetailsType === 'SOME_TYPE'"> <textarea></textarea> </div> </div> </mat-list-option> </ng-container> </mat-selection-list> 需要再分配一个元素(用于尾随realloc),并且您必须在开始循环之前初始化\0

顺便说一句,您可以将s[0] = '\0'替换为append或像这样写

strcat()