【问题标题】:Why do I receive crash report with argv in this example?为什么在此示例中我会收到带有 argv 的崩溃报告?
【发布时间】:2019-02-27 18:49:24
【问题描述】:

TL;DR

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

• 2. argv[] 做什么?它是否收到您的 cmd 输入?以及它与argv 1,2,3...的区别是什么?

• 3. 当我将argv[1] 更改为VSF.txt 时,输出未显示预期结果

以下代码报错:

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

这个想法是用相应的数字打印每个文件行。我还没有完全理解文件,我相信argv[1] 是你在编译器提示符下写的,对吗?它如何与 argv 1、2、3 等区别开来?

如果我将argv[1] 更改为VSF.txt(文件名),它会显示奇怪的字符(不是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);
}

【问题讨论】:

  • 在使用它之前,您不会检查您是否有一个非空的argv[1]。你是如何调用程序的?你提供什么论据?由于您确实检查了您的fopen() 是否成功(非常必要!),所以问题一定是您正在运行没有参数的程序,并且fopen() 反对通过崩溃来使用空指针调用(因为它是允许的做)。
  • @JonathanLeffler 对不起,我不明白你在问什么
  • 运行程序时在命令行输入什么?或者当您从 IDE 运行它时,您给了它什么参数?除非您为其提供文件名,否则它将崩溃。由于它崩溃了,很可能是您没有为它提供文件名。
  • 因此您没有为其提供文件名 — 检查 if (argc != 2) { …print error message and exit… }if (argv[1] == NULL) { …print error message and exit… } 或类似名称,并在调用 fopen() 之前这样做。
  • 崩溃发生是因为你将一个空指针传递给fopen()——并且崩溃发生在fopen()返回之前。您的if 测试为时已晚。在它之前你需要另一个。

标签: c file visual-studio-2017 argv


【解决方案1】:

奇怪的输出问题出在这里:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多