[英]C - character concatenate to string
我有以下簡單的程序,逐字符讀取文本文件。 每次從文件中讀取一個字符時,必須在作為字符串的str的末尾。 出於這個原因,我創建了一個名為conc的小函數,它接受字符,重新分配str ,然后將字符放在字符串的末尾( str [count] = ch )。
在EOF字符之后,我將'\\ 0'字符作為字符串變量的結尾放在str中。 我的問題是為什么最后一個printf顯示垃圾? 有任何想法嗎?? 提前致謝。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void conc(char* str,char ch,int* count);
int main(int argc,char** argv)
{
char* str = (char*)malloc(sizeof(char));
char ch;
int count = 0,i;
FILE* fp = fopen("path","r");
if(fp == NULL){
printf("No File Found");
return 1;
}
ch=fgetc(fp);
while(ch!=EOF){
conc(str,ch,&count);
ch=fgetc(fp);
}
str[count] = '\0';
printf("%s",str);
free(str);
return(0);
}
void conc(char* str,char ch,int* count){
str[*count] = ch;
(*count)++;
//printf("\n%c",str[(*count)-1]);
str = (char*)realloc(str,(*count)+1);
}
問題在於你如何realloc()指針。 您對str
所做的更改不會修改main()
的原始指針。 您只是在conc()
指定指針str
的副本。 您需要將指針傳遞給指針才能對其進行修改。
void conc(char** str,char ch,int* count){
(*str)[*count] = ch;
(*count)++;
*str = realloc(*str,(*count)+1);
}
並從main()
傳遞指向它的指針:
conc(&str,ch,&count);
更改原型以匹配:
void conc(char** str,char ch,int* count);
其他人指出:
1)當realloc()
失敗時,它返回NULL,你將丟失原始指針。 所以你需要使用臨時文件並分配給原文。 請參閱: 動態分配數組可以更改其大小嗎?
2) 轉換malloc()
/ realloc()
等也很危險。
3)始終檢查malloc()
等的返回值,以查看內存分配是否失敗。
3)一次分配一個字符不是很有效。 典型的方法是在realloc()
時分配大小為N的緩沖區並加倍大小。
沒有必要將count
傳遞給你的函數,因為你(或者更確切地說,應該)傳遞一個正確的零終止字符串,並且新字符應該總是添加到它的結尾。
如果你要修改str
,那么從str = NULL
開始稍微好一些。 在第一次調用時,將str
設置為占用2個字節開始,並在每次下一次調用時添加1個字符。
小心char ch;
然后使用while(ch!=EOF) ..
! 這僅在簽名默認char
時有效。 當您在輸入中遇到字節0FFh
時,它也會過早停止。
考慮到這些要點,我最終得到了這樣的結論:
char *conc (char *str, char ch);
int main (void)
{
char *str = NULL;
int ch;
FILE* fp = fopen("path","r");
if(fp == NULL){
printf("No File Found");
return 1;
}
ch=fgetc(fp);
while(ch!=EOF)
{
str = conc (str, ch);
ch = fgetc(fp);
}
printf("%s",str);
free(str);
return 0;
}
char *conc (char *str, char ch)
{
int last_pos;
if (str)
{
last_pos = strlen(str);
str = realloc (str, last_pos+1);
} else
{
str = malloc(2);
last_pos = 0;
}
str[last_pos] = ch;
str[last_pos+1] = 0;
return str;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.