C字符串修改

时间:2017-10-28 21:35:09

标签: c string

我在C

编程时遇到了一个混乱的问题

当我使用oldPacket.filename = "fallout.jpg" //我有一个名为fallout.jpg的文件,以及一个名为oldPakcet且带有char *类型文件名的结构

程序运行良好

现在,我决定让用户输入文件名并检查文件是否存在。我写了以下函数:

bool Searchfile(packet* ptr) {
    char userinput[100];
    fgets(userinput, sizeof (userinput), stdin); //non terminated input by fgets
    userinput[strcspn(userinput, "\n")] = 0;
    //printf("%d\n",strlen(userinput));
    ptr->filename = userinput + 4;//i skip the first 4 char since the correnct format is ftp <filename>
    printf("%s\n",ptr->filename);
    printf("%d\n",strlen(ptr->filename));
    ptr->filename[strlen(ptr->filename)] = '\0';
    if (access(ptr->filename, F_OK) != -1) {
        printf("exist\n");
        return false;
    } else {
        //printf("does not exist\n");
        return true;
    }
}

我通过

调用此函数
while (Searchfile(&oldPacket)){
    printf("Please input the file name in the format: ftp <file name> \n");
}

然而,程序不再有效,并且在

处显示了seg错误
int filesize;
    fp = fopen(oldPacket.filename, "rb");
    fseek(fp, 0L, SEEK_END);//here is the seg fault

任何人都知道为什么会这样?

我已经打印了文件名的每个字符,它看起来正确....

提前致谢

1 个答案:

答案 0 :(得分:2)

您允许ptr->filename指向局部变量userinput的地址,并且userinput超出范围后访问此值是未定义的行为。

段错误的原因可能是filename的值在Searchfile之外访问时可能是垃圾,因此文件不会被打开。然后将使用fseek调用后续NULL - fp ...

解决此问题的一个简单解决方案是编写static char userinput[100];,至少在您不在多线程环境中工作时。否则,您必须为ptr->filename保留内存并复制userinput的内容。