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);。由你决定。