C 在本例中,我为什么会收到带有argv的崩溃报告?
TL;博士 •1。为什么代码在启动时会出现崩溃错误 •2。argv[]做什么?它是否收到您的cmd输入?它与argv的区别是什么 •3。使用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
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()
返回之前。如果
测试太迟,您的。在这之前你还需要一个。