C - 将 argv 的值分配给变量
C - Assigning value of argv to a variable
我在调用程序时将我的 .txt 文件的名称作为参数解析到命令行中。
我想将 .txt 文件的名称分配给 char 变量。
这是我的尝试:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv[])
{
int i;
for (i=0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
FILE *fPointer;
if ((fPointer = fopen("exampleWheel.txt", "r")) == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
return 0;
}
在第 11 行,我想用 argv[1] 的值替换字符串 "exampleWheel.txt",这样我就可以打开任何 .txt 文件。
请告诉我如何将它应用到我现有的代码中。
提前谢谢你:)
在 fopen
调用中,将 "exampleWheel.txt"
更改为 argv[1]
。
这里有一个功能示例。您需要跳过 argv[0],因为它包含实际的程序调用命令。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i;
char filename[100], c;
for (i=1; i < argc; i++){
FILE *fPointer = fopen(argv[i], "r");
if (fPointer == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
// Read contents from file
c = fgetc(fPointer);
while (c != EOF)
{
printf ("%c", c);
c = fgetc(fPointer);
}
printf ("\n");
fclose(fPointer);
}
return 0;
}
希望对您有所帮助!
你最初的问题在这里:
int main(int argc, char **argv[])
{
char **argv[]
是错误的。可以是 char *argv[]
或 char **argv
argv
的间接层级过多。参见:C11 Standard - §5.1.2.2.1 Program startup(p1)。你的编译器应该对你尖叫警告...
您确实启用了警告吗? -Wall -Wextra -pedantic
用于 gcc/clang 或 /W3
用于 VS。我怀疑在您修复 main
的调用并进行您想要的替换后 - 一切都会正常工作。
由于您希望将文件名作为参数传递给 main()
(这是正确的做法),您还需要确保用户在传递 [=20= 之前提供所有必需的参数] 到 fopen
。您可以通过简单的 if (argc < 2)
检查来检查您是否至少为程序提供了 2 个参数。
合并支票,您可以:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fPointer;
if (argc < 2) { /* validate required arguments provided */
fprintf (stderr, "error: insufficient input.\n"
"usage: %s <filename>\n", argv[0]);
return 1;
}
if ((fPointer = fopen (argv[1], "r")) == NULL) {
perror("fopen-argv[1]"); /* a fopen failure sets errno, use perror */
exit (EXIT_FAILURE);
}
return 0;
}
请注意,在失败时 fopen
函数设置 errno
允许您使用 perror()
函数输出系统错误。您可以使用它来补充或代替 fprintf
消息。当您包含 stdlib.h
时,您已经为 EXIT_SUCCESS
(值为 0
)和 EXIT_FAILURE
(值为 1
)定义了系统宏,您可以使用而不是硬编码 exit(1);
。由你决定。
我在调用程序时将我的 .txt 文件的名称作为参数解析到命令行中。 我想将 .txt 文件的名称分配给 char 变量。
这是我的尝试:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv[])
{
int i;
for (i=0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
FILE *fPointer;
if ((fPointer = fopen("exampleWheel.txt", "r")) == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
return 0;
}
在第 11 行,我想用 argv[1] 的值替换字符串 "exampleWheel.txt",这样我就可以打开任何 .txt 文件。
请告诉我如何将它应用到我现有的代码中。
提前谢谢你:)
在 fopen
调用中,将 "exampleWheel.txt"
更改为 argv[1]
。
这里有一个功能示例。您需要跳过 argv[0],因为它包含实际的程序调用命令。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i;
char filename[100], c;
for (i=1; i < argc; i++){
FILE *fPointer = fopen(argv[i], "r");
if (fPointer == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
// Read contents from file
c = fgetc(fPointer);
while (c != EOF)
{
printf ("%c", c);
c = fgetc(fPointer);
}
printf ("\n");
fclose(fPointer);
}
return 0;
}
希望对您有所帮助!
你最初的问题在这里:
int main(int argc, char **argv[])
{
char **argv[]
是错误的。可以是 char *argv[]
或 char **argv
argv
的间接层级过多。参见:C11 Standard - §5.1.2.2.1 Program startup(p1)。你的编译器应该对你尖叫警告...
您确实启用了警告吗? -Wall -Wextra -pedantic
用于 gcc/clang 或 /W3
用于 VS。我怀疑在您修复 main
的调用并进行您想要的替换后 - 一切都会正常工作。
由于您希望将文件名作为参数传递给 main()
(这是正确的做法),您还需要确保用户在传递 [=20= 之前提供所有必需的参数] 到 fopen
。您可以通过简单的 if (argc < 2)
检查来检查您是否至少为程序提供了 2 个参数。
合并支票,您可以:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fPointer;
if (argc < 2) { /* validate required arguments provided */
fprintf (stderr, "error: insufficient input.\n"
"usage: %s <filename>\n", argv[0]);
return 1;
}
if ((fPointer = fopen (argv[1], "r")) == NULL) {
perror("fopen-argv[1]"); /* a fopen failure sets errno, use perror */
exit (EXIT_FAILURE);
}
return 0;
}
请注意,在失败时 fopen
函数设置 errno
允许您使用 perror()
函数输出系统错误。您可以使用它来补充或代替 fprintf
消息。当您包含 stdlib.h
时,您已经为 EXIT_SUCCESS
(值为 0
)和 EXIT_FAILURE
(值为 1
)定义了系统宏,您可以使用而不是硬编码 exit(1);
。由你决定。