【发布时间】: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 < argc; i++)中的i++不会导致所需的两个增量吗?斯科特的回答似乎起到了作用。据我了解,else仅与-t的if语句一起起作用,这意味着任何时候arg不是"-t",flag->inputFile = arg也被运行。在 stackoverflow 上回答您自己的问题以检查您是否完全理解了答案是否被认为是一种糟糕的形式?对不起....菜鸟问题...
标签: c if-statement struct command-line-arguments