【问题标题】:strncat(): Random character in target stringstrncat():目标字符串中的随机字符
【发布时间】:2017-01-24 23:42:01
【问题描述】:

考虑以下程序:

#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 '标题开头')。所以我假设strncat 在这里没有正确使用,一些随机垃圾被写入我的路径数组。

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

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

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

【问题讨论】:

  • char path[path_maxlen]={0};
  • @DYZ 唉,对可变长度数组不起作用。
  • @AlexD 这就是我从不使用可变长度数组的原因...所以,path[0]=0; 是。
  • 请注意,strncat() 的长度参数不是目标字符串中的总空间,而是剩余空间。如果不是这里的小尺寸,您可能会出现缓冲区溢出。这就是为什么strncat() 很危险。

标签: c arrays string strcat


【解决方案1】:
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

【讨论】:

  • 谢谢,我现在看到了。 char path[path_maxlen] = NULL; 是否也可以使用,或者这种方法有什么注意事项吗?
  • 嗯...它编译了吗:-)?
  • 我不小心编辑并编译了程序的备份文件,然后编译了未编辑的文件。所以这些变化似乎很好:-)。但是,在注意到我的错误后,我编辑了正确的文件,但 {0}NULL 版本都无法编译。
  • @nautical, {0} 应该可以工作。您应该发布错误消息。
  • 错误是:error: variable-sized object may not be initialized char path[path_maxlen] = {0};
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多