我正在尝试比较szFileName1和szFileName2,如果它们不相同,那么我将其重命名,但是当我尝试使用snprintf进行连接时,这会产生分段错误。我在这里犯了什么错误?
typedef struct{
char filePath[100];
} filectx;
void filename1(filectx *ctx, const char ** szFileName1){
*szFileName1 = ctx->filepath;
}
void filename2(const char ** szFileName2){
char buf[20] = "/usr/bin/abb.txt";
snprintf(szFileName2, sizeof(szFileName2), "%s%s", szFileName2, buf);
}
int main(){
const char* szFileName1 = NULL;
const char *szFileName2 = malloc(100);
filectx ctx;
ctx.filePath = "/usr/bin/abc.txt";
filename1(&ctx, &szFileName1);
filename2(&szFileName2);
if(strcmp(szFileName1, szFileName2) != 0){
const char szFilePath1[200] = "/local/";
const char szFilePath2[200] = "/local/";
snprintf(szFilePath1, sizeof(szFilePath1), "%s%s", szFilePath1, szFileName1);
snprintf(szFilePath2, sizeof(szFilePath2), "%s%s", szFilePath2, szFileName2);
int ret = rename(szFilePath1, szFilePath2);
}
free(szFileName2);
return 0;
}
答案 0 :(得分:1)
我认为这里的问题在于传递给snprintf()的参数。 snprintf()需要一个字符串类型的参数(“ char *”),而不是“ char **”。
在这里,您传递的是指针而不是实际的字符串。因此,当它尝试访问该地址时,就会出现分段错误。
将函数filename1()和filename2()中的参数更改为“ char *”类型并查看。应该可以。
希望这会有所帮助。
Kranthi
答案 1 :(得分:0)
使用
const char szFilePath1[200] = "/local/";
const char szFilePath2[200] = "/local/";
以及其他函数参数,都声明了这些变量const
。然后,您尝试使用snprintf
向他们写信。不要制作这些const
。
您也不能在snprintf
中将变量重用为源和目标。
我很惊讶编译器允许您编译它。
答案 2 :(得分:0)
尽管snprintf()在您的情况下不起作用,但是为什么不使用strcat()或strncat()? 代替
snprintf(szFilePath1,sizeof(szFilePath1),“%s%s”,szFilePath1,szFileName1);
你可以写
strncat(szFilePath1, szFileName1, strlen(szFilePath1));
顺便说一句: 为什么,您写过
sizeof(szFilePath1)
? 因此,要改进的地方
* szFileName1 = ctx->文件路径;
这不是一件好事。最好使用strcpy()/ strncpy()。并且传递char **参数也看起来很奇怪。