C 在本例中,我为什么会收到带有argv的崩溃报告?

C 在本例中,我为什么会收到带有argv的崩溃报告?,c,file,visual-studio-2017,argv,C,File,Visual Studio 2017,Argv,TL;博士 •1。为什么代码在启动时会出现崩溃错误 •2。argv[]做什么?它是否收到您的cmd输入?它与argv的区别是什么 •3。使用VSF.txt 以下代码给出了一个错误: File: minkernel\crts\ucrt\src\appcrt\stdio\fopen.cpp Line: 30 Expression file_name != null_ptr 这样做的目的是打印每个文件行的相应编号。我还没有完全理解文件,我相信argv[1]是您在编译器提示下编写的,对吗?它与arg

TL;博士

•1。为什么代码在启动时会出现崩溃错误

•2。argv[]做什么?它是否收到您的cmd输入?它与argv的区别是什么

•3。使用
VSF.txt

以下代码给出了一个错误:

File: minkernel\crts\ucrt\src\appcrt\stdio\fopen.cpp
Line: 30
Expression file_name != null_ptr

这样做的目的是打印每个文件行的相应编号。我还没有完全理解文件,我相信
argv[1]
是您在编译器提示下编写的,对吗?它与argv 1、2、3……等有何区别

如果我用
VSF.txt
(文件名)更改
argv[1]
,它会显示奇怪的字符(而不是
VSF.txt

输出只显示一行内容,没有空格,行变量不递增;为什么不打印
VSF.txt的内容

#define _CRT_SECURE_NO_WARNINGS

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

main(int argc, char *argv[])
{
    FILE *file = stdout;
    int lines = 1, start = 1;
    char ch;

    if ((file = fopen(argv[1], "r")) == NULL)
    {
        printf("Impossivel de abrir o arquivo :%s", argv[1]);
        exit(0);
    }
    while (ch = fgetc(file) != EOF)
    {
        if (ch == '\n')
        {
            lines++;
            start = 1;
        }
        else if (start == 1)
        {
            printf("%d: ",lines);
            putchar(ch);
            start = 0;
        }
        putchar(ch);
    }
    fclose(file);
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#包括
#包括
main(int argc,char*argv[])
{
FILE*FILE=stdout;
int lines=1,start=1;
char ch;
if((file=fopen(argv[1],“r”)==NULL)
{
printf(“abrir o arquivo的关税税率:%s”,argv[1]);
出口(0);
}
while(ch=fgetc(文件)!=EOF)
{
如果(ch='\n')
{
行++;
开始=1;
}
else if(start==1)
{
printf(“%d:,行);
putchar(ch);
开始=0;
}
putchar(ch);
}
fclose(文件);
}

奇怪输出的问题在于:

while (ch = fgetc(file) != EOF)
不等式运算符
=的优先级高于赋值运算符
=
。因此,上述表达式与:

while (ch = (fgetc(file) != EOF))
这将为
ch
指定一个布尔值,即0或1。这就是为什么你会得到你得到的输出。将括号放在适当的位置:

while ((ch = (fgetc(file)) != EOF)
至于崩溃,这是因为运行程序时没有告诉程序要打开的文件名。如果从命令提示符下运行,请执行以下操作:

archives VSF.txt

如果您从Visual Studio内部运行它,请转到“项目设置”,并在“调试”下将命令参数设置为VSF.txt。

在使用它之前,您不会检查是否有非空的
argv[1]
。你是如何调用这个程序的?你提供了什么论据?由于您确实检查了
fopen()
是否成功(非常必要!),问题一定是您正在运行没有参数的程序,并且
fopen()
通过崩溃反对使用空指针调用(这是允许的)@JonathanLeffler抱歉我不明白你在问什么运行程序时在命令行上键入什么?或者,当您从IDE运行它时,您给出了哪些参数?除非提供文件名,否则它将崩溃。由于它崩溃,很可能您没有为它提供文件名。因此您没有为它提供文件名-请检查
if(argc!=2){…打印错误消息并退出…}
if(argv[1]==NULL){…打印错误消息并退出…}
或类似内容,并在调用
fopen()
。发生崩溃的原因是您向
fopen()
传递了一个空指针,而崩溃发生在
fopen()
返回之前。如果
测试太迟,您的
。在这之前你还需要一个。