我写了这段代码,但是在字符串的开头插入了垃圾:
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);
}
我该怎么办?
答案 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()