main中的预处理命令

时间:2016-04-21 08:48:20

标签: c preprocessor-directive

您好我试图找到用户是否使用命令行将特定文件名传递给我的程序,如果用户没有,我将提示用户输入所需的文件名。

此外,我必须使用预处理命令来执行此操作。

int main(int argc, char * argv[]) 
{
    char original[100] = "";
    char sorted[100] = "";
    if (argc == 0 || argc == 1) 
    { 
        #define PROMPT 1
    }

    FILE * f;
    FILE * s;
    #ifdef PROMPT
    printf("Please input original file name: ");
    scanf("%s", original);
    f = fopen(original, "rw");
    printf("Please input sorted file name: ");
    scanf("%s", sorted);
    s = fopen(sorted, "rw");
    #else
    f = fopen(argv[1], "rw");
    s = fopen(argv[2], "w");
    #endif
}

1 个答案:

答案 0 :(得分:1)

您不能在运行时使用preprossor命令。这就是为什么它被称为 处理器

你需要这个:

int main(int argc, char * argv[]) 
{
    char original[100] = "";
    char sorted[100] = "";
    bool prompt = false;

    if (argc == 0 || argc == 1) 
    { 
        prompt = true;
    }

    FILE * f;
    FILE * s;

    if (prompt)
    {
       printf("Please input original file name: ");
       scanf("%s", original);
       f = fopen(original, "rw");
       printf("Please input sorted file name: ");
       scanf("%s", sorted);
       s = fopen(sorted, "rw");
    else
    {
       f = fopen(argv[1], "rw");
       s = fopen(argv[2], "w");
    } 
}

或许你想要这个:

#define PROMPT 1

int main(int argc, char * argv[]) 
{
    char original[100] = "";
    char sorted[100] = "";

    FILE * f;
    FILE * s;

#if PROMPT
    printf("Please input original file name: ");
    scanf("%s", original);
    f = fopen(original, "rw");
    printf("Please input sorted file name: ");
    scanf("%s", sorted);
    s = fopen(sorted, "rw");
#else
    if (argc == 0 || argc == 1) 
    { 
        printf("wrong command line arguments\n");
        return 1;
    }
#endif

    f = fopen(argv[1], "rw");
    s = fopen(argv[2], "w");
}

有了这个,你可以编译你的程序的两个版本。如果使用#define PROMPT 1进行编译,则会获得始终提示输入的版本,如果使用#define PROMPT 0进行编译,则会获得始终采用命令行参数的版本。

旁注(与您的问题没有直接关系)

您的测试参数数量是否正确是错误的:argc至少为1,因为它是命令行参数的数量,包括命令本身的名称,因此测试应该是:

if (argc == 1 || argc == 2) 

甚至更好

if (argc != 3)