为什么在此示例中我会收到带有 argv 的崩溃报告?
Why do I receive crash report with argv in this example?
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
中的内容)
输出仅用一行显示所有内容,没有 space 并且行变量不递增;为什么它不打印 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);
}
奇怪输出的问题在这里:
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。
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
中的内容)
输出仅用一行显示所有内容,没有 space 并且行变量不递增;为什么它不打印 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);
}
奇怪输出的问题在这里:
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。