【问题标题】:How do I get rid of this Segmentation Fault?如何摆脱这种分段错误?
【发布时间】:2020-03-07 02:16:53
【问题描述】:

我正在尝试创建一个从文件名中提取扩展名的函数。 file_name 指向一个包含文件名的字符串。该函数应将文件名的扩展名存储在扩展名指向的字符串中。例如,如果文件名为“memo.txt”,该函数会将“txt”存储在扩展名指向的字符串中。如果文件名没有扩展名,该函数应该在扩展名指向的字符串中存储一个空字符串(单个空字符)。

这就是我所拥有的:

  #include <stdio.h>

void get_extension(char *file_name, char *extension);
int main(){
    char *ex;
    get_extension("hello.txt", ex);

    char *p;
    for(p = ex; *p != '\0'; p++){
        printf("extension: %c", *p);
    }

    return 0;
}

void get_extension(char *file_name, char *extension){

    char *p;

    for (p = file_name; *p != '\0'; p++){

        if(*p == '.'){
            p++;

            while(*p != '\0'){
                *extension = *p;
                p++;
                extension++;
            }
        }  *extension = '\0';
    }

}

我不断收到分段错误错误,我不知道出了什么问题。 有人能帮助我吗? 谢谢!

【问题讨论】:

  • 你有一个指针ex,但是它指向哪里?当你做*extension = *p时,你在哪里写?
  • 这能回答你的问题吗? Getting file extension in C

标签: c segmentation-fault


【解决方案1】:

您的段错误可能有 2 个原因。

1) ex 不指向任何内存。因此,在函数内部,您使用未初始化的指针写入内存位置。这真的很糟糕。

2) 在函数中,内部while 循环一直持续到字符串结束。然后外循环递增p 并取消引用它。因此,您阅读的内容超出了字符串结尾,这又是非常糟糕的。

试试看:

#include <stdio.h>

#define MAX_EXT_LEN 100

void get_extension(char *file_name, char *extension, int sz);

int main(){
    char ex[MAX_EXT_LEN];  // Create an array to store the data

    get_extension("hello.txt", ex, sizeof ex);

    char *p;
    printf("extension: ");
    for(p = ex; *p != '\0'; p++){
        printf("%c", *p);
    }

    return 0;
}

void get_extension(char *file_name, char *extension, int sz){

    char *p = file_name;

   if (file_name == NULL || extension == NULL || sz < 1) return;

    while (*p != '\0' && *p != '.') ++p;

    if(*p == '.') ++p;

    int cnt = 0;
    while(*p != '\0' && cnt < (sz-1)){
        extension[cnt] = *p;
        ++p;
        ++cnt;
    }

    extension[cnt] = '\0';
}

【讨论】:

    【解决方案2】:

    你应该改变这部分:

    int main(){
        char *ex;
    

    变成不仅声明一个指针,而且分配内存来存储结果的东西:

    int main(){
        char ex[100];
    

    此外,我建议您查看strrchr(),它可以帮助您更轻松地找到扩展程序:Getting file extension in C


    另外我想注意到这段代码:

    char *p;
    for(p = ex; *p != '\0'; p++){
        printf("extension: %c", *p);
    }
    

    不会像你想象的那样工作。例如对于“hello.txt”将打印:

    extension: textension: xextension: t
    

    不确定这是不是你想要的。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2012-01-15
      • 2015-04-29
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      相关资源
      最近更新 更多