C中的独立字符串操作变化

时间:2015-05-01 11:05:56

标签: c string

我在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()给出001encapsule(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给了我:{��}并在文件中写入{à}

我真的不明白为什么这个功能的行为搞砸了......

感谢您将来的帮助,我希望!

2 个答案:

答案 0 :(得分:8)

下面

strcat(output,string);

strcat首先在\0中找到output。 NUL终结符在哪里?你没有分配它。因此,您的代码展示了Undefined Behavior

解决问题的两种方法:

  1. malloc切换为calloc

    output = calloc( n+3 , sizeof(char));
    
  2. 添加

    output[1]='\0';
    

    strcat

  3. 之前

答案 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;
}