【问题标题】:Segfault when editing a string? [duplicate]编辑字符串时出现段错误? [复制]
【发布时间】:2013-10-30 02:22:24
【问题描述】:

我必须在 C 中创建一个可以将文件扩展名交换为另一个的函数。例如:

swapExtension("myFile.c", "o");

原型是:

char * swapExtension(char * fileName, char * fileExtension).

除了段错误,我什么也没得到。我的代码是:

{
    char * temp = strchr(fileName, '.');
    printf("%s",temp);
    strncpy(temp, nouvelleExtension, 2);
}

【问题讨论】:

  • 您可能正在传递一个指向文字字符串“myFile.c”的指针,然后在您的函数中写入它。根据平台的不同,这很容易发生段错误。您必须创建一个缓冲区来处理,并在那里操作字符串。
  • 请不要在 SO 上使用脏话;谢谢@hopper
  • nomFic 是文件名,我刚刚修好了。
  • 尝试使用:char filename[] = "myFile.c";并调用 swapExtension(filename, "o");这样,您将声明一个使用字符串字符初始化并调整为文字字符串大小的 char 数组。警告:如果您尝试编写更长的扩展名(例如“.c”文件名上的“.obj”),这将给您带来错误。更多信息:stackoverflow.com/a/164229/253111
  • 检查空指针if(temp == NULL) { printf("Null string");}。这将为您提供有关代码中发生了什么的线索。

标签: c char file-extension


【解决方案1】:

你的代码有两个问题 1)您正在使用 char * 正在尝试修改代码中的受保护内存

2) 你试图从你的函数返回一个本地地址,这也不好。

3) 如果文件名包含点“.”怎么办?在其文件名中。

您可以使用 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;

}

【讨论】:

  • 或者改用strrchr。此外,您的代码在 char * retBuff = new char[retsize]; 行包含语法错误(OP 使用的是 C,而不是 C++)。
  • ok...可以改成malloc。
【解决方案2】:

正如 Baldrick 所提到的,您将(指向)字符串常量传递给 swapExtension,然后将该字符串常量传递给 strchr,后者又返回同一字符串常量的一部分。然后使用strncpy 写入字符串常量,它是未定义的行为,在你的情况下是段错误。

改用字符串(字符)数组:

char myFile[] = "myFile.c";
swapExtension(myFile, "o");

现在swapExtension 中的temp 将写入有效的myFile 数组。不过,请注意,这仅在扩展的长度相同时才有效,否则数组中将没有足够的空间。为防止这种情况,请使用:

char myFile[50] = "myFile.c";

数组最初将包含相同的字符串,但也会有空间容纳更长的字符串。

另请参阅:What is the difference between char s[] and char * s in C

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2019-08-21
    • 2020-10-02
    • 2012-06-25
    相关资源
    最近更新 更多