C 打开文件时,简单的程序会导致seg错误

C 打开文件时,简单的程序会导致seg错误,c,file,printing,segmentation-fault,arguments,C,File,Printing,Segmentation Fault,Arguments,我有一个文本文件,其中包含一堆字符串,对于我的问题来说没有什么重要的 这里的代码编译/运行,如果我键入正确的文本文件,第一个If语句将运行。然而,如果我不这样做,else语句就不会执行,但是我得到了一个seg错误,那么在这里Mallocing指针会有帮助吗?任何帮助都将不胜感激 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int mai

我有一个文本文件,其中包含一堆字符串,对于我的问题来说没有什么重要的

这里的代码编译/运行,如果我键入正确的文本文件,第一个If语句将运行。然而,如果我不这样做,else语句就不会执行,但是我得到了一个seg错误,那么在这里Mallocing指针会有帮助吗?任何帮助都将不胜感激

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main (int argc, char * argv[])
{

    FILE * ptr;

    if(strcmp(argv[1],"test.txt") == 0)
    {
        printf("Right text file was inputted");
    }
   //but if I wan't the alternative (if the user didn't enter the right thing

    else
    {
     // this never executes, but instead the program just seg faults if the first if statement is not true
     printf("You didn't enter the right textfile, or none at all");
     exit(1);
    }
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*ptr;
if(strcmp(argv[1],“test.txt”)==0)
{
printf(“输入了正确的文本文件”);
}
//但是如果我不想选择(如果用户没有输入正确的内容
其他的
{
//这永远不会执行,但是如果第一个if语句不正确,程序只会seg错误
printf(“您没有输入正确的文本文件,或者根本没有”);
出口(1);
}
}

您应该使用
argc
(给定参数数量的计数)来确定是否输入了值。目前,访问
argv[1]
argc
0
时,当
strcmp
取消引用终止的
NULL
指针时,当您访问数组的末尾时,将导致分段错误

您的第一个
if
语句应该是:

if(argc > 1 && strcmp(argv[1],"test.txt") == 0) {
...

将参数传递给main()时,它们以字符串形式传递给main()。argc是传递给main()的参数计数argv是参数向量,它总是以NULL结尾。因此,如果你不提供任何参数,你必须先用argc count检查,然后再继续。另一件事是,你不能在一个条件下检查是否传递了错误的文件名或根本没有传递文件名

应该是,

int main (int argc, char * argv[])
{
    FILE * ptr;
    if(argc>1)
    {
        if(strcmp(argv[1],"test.txt") == 0)
        {
            printf("Right text file was inputted");
        }
        else
        {
            printf("You didn't enter the right textfile");
            exit(1);
        }
    }
    else
        printf("you havn't entered any file name");
}

您根本没有访问
ptr
。“您没有”表示您没有键入任何文件名作为参数,或者只是键入了不正确的文件名?我猜您没有键入任何文件名,因此出现了索引超出范围的问题。您应该先检查argc,然后检查argv此代码没有完全编译,原因(至少)有两个。1)未使用传递的参数“argc”。2) 此函数声明为返回int,但实际上并不返回int。(它需要'return(0);'就在最后一个结束'}之前。实际上这不完全正确。argv[]数组总是有一个最终的空指针项。实际的问题是试图取消引用该空指针以与“test.txt”进行比较。正如您所说的,解决方法是检查argc是否大于1,以确保有一个有效值可供检查。@user362949谢谢,更新了我的答案。我已经有一段时间没有做过任何C编程了。