是否可以在 c 中使用 <unistd.h> 和 <getopt.h> 来读取单词之间带有空格的参数?

问题描述

我对 C 和编程有点陌生,所以请谨慎对待。 基本上,我试图让 getopt 函数接收它们之间带有空格的参数。 For example

./covid19 -i f_texto1.csv -L all -S inf 2020-27 -D inf -P max 5000 -o f_dados.dat

在这里,当我想输入 -S 时,我需要说 inf 和 2020 年的一周,但我只能让它占据“inf”部分。

解决方法

如果您提供的参数中带有空格,getopt() 和朋友将返回这些带有空格的参数。您必须告诉 shell 保留空格——通常使用引号,但如果您愿意,也可以使用反斜杠。

例如:

./program one 'two potatoes' 'three   spaces' "  spaces before and after  " \ \ seven\ backslashes\ \\\ vanish\ \ 

标准的 Unix shell 会这样处理,以便在程序内部,int main(int argc,char **argv) 函数看到:

argc    = 6;
argv[0] = "./program";
argv[1] = "one";
argv[2] = "two potatoes";
argv[3] = "three   spaces";
argv[4] = "  spaces before and after  ";
argv[5] = "  seven backslashes \\ vanish  "; // Note there's a single backslash left
argv[6] = NULL;

当然,其中没有 -x 类型选项,但您可以根据需要添加它们。当相应的参数(或参数的一部分)包含空格时,optarg 中的值将包含空格。

了解 shell 与其执行的程序之间的交互非常重要。

您需要将命令行输入为:

./covid19 -i f_texto1.csv -L all -S "inf 2020-27" -D inf -P "max 5000" -o f_dados.dat

使用 GNU getopt(),假设选项字符串包含“i:L:S:D:P:o:”,并且没有 export POSIXLY_CORRECT=1,您将获得 2020-27 和 { {1}} 作为位置参数在选项 5000-i-L-S-D-P 已在主 -o 循环。