我是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");
}
以上功能使用您的输入。谢谢你。
答案 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 *