为什么我在此示例中使用argv收到崩溃报告?

时间:2018-06-03 14:11:02

标签: c file visual-studio-2017 argv

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

error image

想法是打印具有相应编号的每个文件行。我还没有完全理解文件,我相信argv[1]是你在编译器提示下写的,是吗?它如何区分argv 1,2,3 ...等等?

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

VSF.txt image

cmdoutput

输出只显示一行,没有空格和行变量不递增;为什么它不打印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);
}

1 个答案:

答案 0 :(得分:0)

奇怪输出的问题在于:

while (ch = fgetc(file) != EOF)

不等式运算符!=的优先级高于赋值运算符=。所以上面的表达式与:

相同
while (ch = (fgetc(file) != EOF))

这为ch赋予了一个布尔值,0或1.这就是你获得输出的原因。将括号放在适当的位置:

while ((ch = (fgetc(file)) != EOF)

至于崩溃,这种情况正在发生,因为你没有告诉程序你运行它时想要打开的文件的名称。如果从命令提示符运行它,请执行以下操作:

archives VSF.txt

如果从Visual Studio内部运行它,请转到项目设置,然后在Debugging set Command Arguments to VSF.txt下。