strncat():目标字符串中的随机字符

时间:2017-01-24 23:42:01

标签: c arrays string strcat

考虑以下计划:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {

    int ret = 0;

    char dirname[] = "test/";
    int path_maxlen = 256;
    char path[path_maxlen];
    int filename_maxlen = path_maxlen - strlen(dirname);

    strncat(path, dirname, path_maxlen - 1);

    strncat(path, "file.txt", filename_maxlen);

    FILE *file = fopen(path, "r");

    printf("path: %s\n", path);

    if (file != NULL) {
        printf("success\n");

        fclose(file);
    } else {
        printf("fail\n");
        ret = 1;
    }

    return ret;
}

这似乎最初起作用,但之后它开始失败,即文件无法打开,尽管它存在并且没有对程序或文件进行任何更改。

此时我添加了打印出path的行。在将输出重定向到文件后,结果发现path前面有一个随机字符(ASCII:1 SOH&#39;标题的开头&#39;)。所以我假设strncat在这里没有正确使用,一些随机垃圾被写入我的路径数组。

如何正确连接上例中的字符串?

PS:我的操作系统是Ubuntu 16.04。编译器是:

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

1 个答案:

答案 0 :(得分:4)

strncat(path, dirname, path_maxlen - 1);

path未初始化,因此未定义行为。

尝试

char path[path_maxlen];
path[0] = 0; // since path is VLA, usual "={0}" initialization does not work 

或者您可以考虑仅使用strcpy_s