使用snprintf串联c中的给出分段错误

时间:2018-08-29 20:47:25

标签: c

我正在尝试比较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;
}

3 个答案:

答案 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)

? 因此,要改进的地方

  1. 在一开始:
  

* szFileName1 = ctx->文件路径;

这不是一件好事。最好使用strcpy()/ strncpy()。并且传递char **参数也看起来很奇怪。

  1. 如上所述。 snprintf的用法