我尝试使用此功能写入文件。 当我用这一行调用函数时,文件仍然为空:
if(argc-optind==0){
char* line=readcli();
printf("testline:%s\n",line); //WORKS
line=replacet(line,t,countt(line));
if(oFlag==1){
writeinfile(line,oFileName);
}else{
printf("Expanded:%s\n",line);
}
}
但是,如果我这样称呼它,它将起作用:
char text[]={"test"};
char * textptr=text;
writeinfile(textptr,fp);
void writeinfile(char* line,char* file){
FILE *f = fopen(file, "a");
if (f == NULL){
printf("Error opening file!\n");
exit(1);
}
fprintf(f, "Some text: %s\n",line);
fclose(f);
}
用空格替换制表符
char* replacet (char *text, int tabsize, int tabanz){
int newsize=strlen(text)+tabsize*tabanz-tabanz;
char newtext[newsize];//Wenn \t nu ein zeichen ist
char* ptrnew=newtext;
char* ptr=text;
for(int i=0;i<strlen(text);i++,ptr++){
if(text[i]=='\t'){
for(int j=0;j<tabsize;j++){
*ptrnew=' ';
ptrnew++;
}
}else{
*ptrnew=text[i];
ptrnew++;
}
}
char* newtextptr=newtext;
return newtextptr;
}
读取在命令行界面上输入的行
char* readcli(){
char *buffer;
size_t bufsize = 64;
size_t chars;
buffer = (char *)malloc(bufsize * sizeof(char));
if( buffer == NULL){
perror("Error malloc");
}
printf("Type something with Tabulators: ");
chars = getline(&buffer,&bufsize,stdin);
printf("%zu characters were read.\n",chars);
return buffer;
}
请帮助我,我不知道该如何解决。 谢谢
答案 0 :(得分:0)
两个问题:
在这里
char* replacet (char *text, int tabsize, int tabanz){
int newsize=strlen(text)+tabsize*tabanz-tabanz;
char newtext[newsize];//Wenn \t nu ein zeichen ist
...
char* newtextptr=newtext;
return newtextptr; /* <-- HERE */
返回局部变量(newtext
)的地址。内存仅在函数内部有效。
函数返回内存的那一刻会自动释放。返回函数后访问它会调用臭名昭著的Undefined Behaviour。此刻什么都可能发生。不要这样做。
函数replacet()
未能0
终止新的C-“字符串”。
要解决所有这些替换问题
char newtext[newsize];
作者
char * newtext = malloc(newsize + 1); /* +1 for 0-terminator each
c-"string" needs */
if (NULL == newtext) /* Error checking is debugging for free. */
{
return NULL;
}
在离开前添加0
终止符:
newtext[i] = '\0'; /* or just the equivalent: ... = 0; */
char* newtextptr = newtext;
return newtextptr;
}
从
更改呼叫代码 line=replacet(line,t,countt(line));
到
{
char * pctmp = replacet(line, t, countt(line));
if (NULL == pctmp)
{
/* exit or do what error handling made sense */
exit(EXIT_FAILURE); /* include stlib.h for the EXIT_* macros */
}
else
{
free(line);
line = pctmp;
}
}