我在C中遇到了一个非常恼人的问题:
我写了这个函数来封装任何带有{}
的字符串:
char* encapsule(char* string) {
char* output;
int n;
n = strlen(string);
output = malloc((n+3)*sizeof(char));
output[0] = '{';
strcat(output,string);
output[n+1] = '}';
output[n+2] = '\0';
return output;
}
当我在我的主要功能中使用它时,它就像一个魅力:
char* foo = encapsule(getTest());
printf("foo : %s\n",foo);
(getTest()
给出001
,encapsule(getTest())
给出{001}
)
现在当我在这样的辅助函数中使用它时:
long ligne1(FILE* tex_file, long cursor) {
char* line;
char* save_text;
char* foo;
foo = encapsule(getTest());
printf("foo : %s\n",foo);
save_text = copyFile(tex_file);
rewind(tex_file);
line = readLine(tex_file,1);
fseek(tex_file, rightPlace(line), SEEK_SET);
fputs(foo, tex_file);
cursor = ftell(tex_file);
fputs(save_text, tex_file);
fseek(tex_file,cursor,SEEK_SET);
return cursor;
}
printf给了我:{��}
并在文件中写入{à}
。
我真的不明白为什么这个功能的行为搞砸了......
感谢您将来的帮助,我希望!
答案 0 :(得分:8)
下面
strcat(output,string);
strcat
首先在\0
中找到output
。 NUL终结符在哪里?你没有分配它。因此,您的代码展示了Undefined Behavior。
解决问题的两种方法:
将malloc
切换为calloc
:
output = calloc( n+3 , sizeof(char));
添加
output[1]='\0';
在strcat
。
答案 1 :(得分:4)
由于您正在应用功能,该功能无效 strcat到非零终止字符串
strcat(output,string);
有效的功能可能看起来像
char* encapsule( const char *string )
{
char *output;
size_t n;
n = strlen( string );
output = malloc( ( n + 3 ) * sizeof( char ) );
output[0] = '{';
output[1] = '\0';
strcat( output, string );
output[n+1] = '}';
output[n+2] = '\0';
return output;
}
另一种方法是使用strcpy
代替strcat
。例如
char* encapsule( const char *string )
{
char *output;
size_t n;
n = strlen( string );
output = malloc( ( n + 3 ) * sizeof( char ) );
output[0] = '{';
strcpy( output + 1, string );
output[n+1] = '}';
output[n+2] = '\0';
return output;
}