为什么strcat在传递常数时不能正常工作?

时间:2014-10-06 00:16:20

标签: c

我是C的新手。我一直在寻找几个小时来找到这个问题的答案,但没有运气。非常感谢您的帮助。

我需要编写一个以文件路径为参数的函数(我在下面调用这个参数WorkingDir)

此功能

void test1(char *WorkingDir)
{
    FILE *out_file1;
    out_file1 = fopen(strcat(WorkingDir,"Th.txt"), "wt"); 
    // the above attempts to open file   /WorkingDir/Th.txt
    fclose(out_file1);
}

称为

test1("/my/directory/")

不起作用(它没有按要求设置路径),虽然这个工作正常

void test2(char *WorkingDir) #argument is not used anywhere
{
    char path[100]="/my/directory/";
    FILE *out_file1;
    out_file1 = fopen(strcat(path,"Th.txt"), "wt");
    fclose(out_file1);
}

谢谢大家的回答。我没有提到的一个重要细节是我从R调用C函数。要将字符串从R传递给C需要char **参数。所以这个函数根据需要设置路径:

void test101(char **WorkingDir){
    const int MAX_PATH = 300;
    char path_name[MAX_PATH + 1];
    snprintf(path_name,MAX_PATH,"%s%s",*WorkingDir,"Th.txt");
}

以上功能使用您的输入。谢谢你。

3 个答案:

答案 0 :(得分:3)

strcat将字符添加到字符数组的末尾。您无法修改常量。所以当你传入一个常量时,它会失败。你必须分配一个新的字符数组,复制你的工作目录,然后连接你的附加路径。或者使用sprintf而不是strcat,但是否则相同。

答案 1 :(得分:0)

strcat附加到第一个参数,所以你所做的事既不正确也不安全。分配足够的空间来保存路径名称。

const int MAX_PATH = 300;
char path_name[MAX_PATH + 1];

将参数复制到path_name(使用snprintf)并附加文件名(也使用snprintf)。

void test(char *dir)
{   FILE *fp;
    size_t len_dir, len_file;

    len_dir = strlen(dir);
    len_file = strlen("Th.txt");

    assert(len_dir + len_file <= MAX_PATH);

    snprintf(path_name, MAX_PATH, "%s%s", dir, "Th.txt");

    fp = fopen(path_name, "wt");
    if(fp)
    {   // process file
        fclose(fp);
    }
}

答案 2 :(得分:-2)

test1("/my/directory/")

将const char指针(const char *)传递给readonly(不可变)字符串。您可能正在获得SIGSEGV。

你传递了一个const char *;不是char *