【问题标题】:Command line arguments using if/else statements in C [closed]在 C 中使用 if/else 语句的命令行参数 [关闭]
【发布时间】:2016-03-25 19:26:17
【问题描述】:

我是编程新手,这让我很困惑。

我正在编写一个由main 调用的函数,它接受命令行参数并将它们存储在struct 中以供以后使用。此特定示例用于图像编辑,但可以在任何地方使用。

所需性能:函数从命令行获取参数。识别并检查三个特定参数:-h-o-t。如果存在,它们将更改 struct 值。参数-o-t 将紧跟它们的参数存储到它们各自的struct 字段中。任何不是-h 或前面没有-o-t 的参数都被假定为输入文件名并存储在flag->inputFile 中。如果考虑了所有参数,则flag->inputFile 应保持为NULL,并且可以在主函数中进行测试,如果为真则终止程序。

问题:当没有指定输入文件(使用上述参数)时,flag->inputFile 在作为参数包含时不断设置为-o

解决方案:感谢 Scott,已通过用 else if 替换几个 if 语句来回答这个问题,现在似乎解决了问题,并且该功能似乎可以按预期工作。 我对正在发生的事情的理解是 else 语句在 i 的每次迭代中都运行,除非包含 -t 参数,因为它是紧接在 else 之前的语句

我使用的编译器是 gcc,这是我的代码。 (我知道我的结构没有打包,我仍在努力解决这个问题,但看不出它会如何导致我所看到的。分段错误,是的,但不是这个?)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct PROMPTFLAGS {
    int help;    // Change from NULL if -h argument present
    char * outputFile;    // Store argument after -o as the output file
    char * inputFile;    // Argument not paired with a flag stored here as input file
    float threshold;    // Stores a value to use in image manipulation in main
};

struct PROMPTFLAGS * parsargs(int argc, char * argv[]) {
    struct PROMPTFLAGS* flag = malloc(sizeof(struct PROMPTFLAGS));
    int i;
    printf("argc: %d\n",argc);
    for (i = 1; i < argc; i++) {
        char * arg = argv[i];
        int str_aft = i+1;    // Allows the next string to be used in this iteration of the loop
        if (strcmp(arg,"-h") == 0) {
            flag->help = 1;
        }
        if (strcmp(arg,"-o") == 0) {    // Changing this to 'else if' seems to be a fix
            flag->outputFile = argv[str_aft];
            i++;        // Skips over next arg since already read by argv[str_aft]
        }
        if (strcmp(arg,"-t") == 0) {    // Changing this to 'else if' seems to be a fix
            flag->threshold = strtod(argv[str_aft],NULL);
            i++;        // Skips over next arg since already read by argv[str_aft]
        }
        else {
            flag->inputFile = arg;
        }
    }
    return flag;
}

int main(int argc, char* argv[]) {

    struct PROMPTFLAGS * flags;
    flags = parsargs(argc, argv);
    printf("Help = %d\n",flags.help);
    printf("Output = %s\n",flags.outputFile);
    printf("Input = %s\n",flags.inputFile);
    printf("Threshold = %s\n",flags.threshold);

return 0;
}

对于这个问题的第一个版本的糟糕格式,我深表歉意,并希望这次编辑更好。我已经使函数的预期结果和遇到的问题更加清晰,并删除了我通过代码获得的大部分测试打印并添加了一些 cmets。我还包括了我的问题的解决方案(由另一个用户提供)以及我对损坏代码中发生的事情的理解。

如果人们仍然认为这是一个糟糕的问题或对其他人没有用,那么我很乐意将其删除,但已编辑并保留它,希望它可以帮助其他人。

这是我关于堆栈溢出的第一篇文章,我感谢大家在我学习编码时的帮助和耐心以及发布问题的最佳方式。

【问题讨论】:

  • 如果您以前没有这样做过,现在是学习如何使用调试器的好时机。有了它,您可以逐行浏览代码,同时监控变量及其值。调试器和如何使用它的知识是编程不可或缺的一部分。
  • 分配后零填充*flag
  • @JoachimPileborg 感谢您的建议,我现在会花一些时间使用调试器,看看我能得到什么。
  • @PaulOgilvie 我在每个 if 语句的末尾递增。
  • @PaulOgilvie 在if 语句末尾和for (i = 1; i &lt; argc; i++) 中的i++ 不会导致所需的两个增量吗?斯科特的回答似乎起到了作用。据我了解,else 仅与-tif 语句一起起作用,这意味着任何时候arg 不是"-t"flag-&gt;inputFile = arg 也被运行。在 stackoverflow 上回答您自己的问题以检查您是否完全理解了答案是否被认为是一种糟糕的形式?对不起....菜鸟问题...

标签: c if-statement struct command-line-arguments


【解决方案1】:

只要arg 不是"-t"(测试"-t" 后的else),就设置flag-&gt;inputFile = arg。我不确定您何时要分配给该字段,但我确信这不是正确的逻辑。例如,如果您想在 arg 不是您要查找的其他特定标志时执行此操作,则应使用 if ... else if ... else if ... else

【讨论】:

  • 是的,并且 OP 在其调试器下运行时应该已经看到了这种行为:(
  • 谢谢!现在看起来很明显.....:/
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2014-08-04
相关资源
最近更新 更多