我必须在 C 中创建一个可以将文件扩展名交换到另一个文件扩展名的函数。例如:
swapExtension("myFile.c", "o");
原型是:
char * swapExtension(char * fileName, char * fileExtension).
除了段错之外我什么也得不到。我的代码是:
{
char * temp = strchr(fileName, '.');
printf("%s",temp);
strncpy(temp, nouvelleExtension, 2);
}
答案 0 :(得分:1)
您的代码中存在两个问题 1)您正在使用char *正在尝试修改代码中的受保护内存
2)你试图从你的函数返回一个本地地址,这也是不好的。
3)如果文件名包含DOT',该怎么办?在其文件名中。
您可以使用char数组作为解决方案,但仍然存在第二个问题,因为您应该分配一些内存,然后将返回的字符串复制到该内存中
char* swapExtension(char * fileName, char * fileExtension)
{
int newext = strlen(fileExtension);
bool flag =false;
int size = strlen(fileName);
int ext = 0;
for(int i=size-1;i>=0;i--)
{
if(fileName[i] == '.')
{
flag = true;
ext = (size -1) - i;
break;
}
}
if(!flag){
printf("no extension found");
return NULL;
}
int retsize = size - ext + newext + 1;
char * retBuff = new char[retsize];
retBuff[0]='\0';
memcpy(retBuff,fileName,retsize);
strncpy(&retBuff[size-ext], fileExtension, newext);
return retBuff;
}
答案 1 :(得分:0)
正如Baldrick所提到的,你将(指针)字符串常量传递给swapExtension
,然后将该字符串常量传递给strchr
,后者又返回相同字符串常量的一部分。然后使用strncpy
写入字符串常量 undefined behavior ,在您的情况下为段错误。
改为使用字符串(字符)数组:
char myFile[] = "myFile.c";
swapExtension(myFile, "o");
现在temp
中的swapExtension
将写入有效的myFile
数组。但是,请注意,这仅在扩展的长度相同时才起作用,否则阵列中将没有足够的空间。为防止这种情况,请使用:
char myFile[50] = "myFile.c";
数组最初将包含相同的字符串,但也会有更长的空格。
另请参阅:What is the difference between char s[]
and char * s
in C