- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据我将选项传递给该程序的格式,变量 optind
将正确递增以反射(reflect)下一个选项值,否则不会递增。
如果我使用 ./cfind -aru
,我会得到以下(奇怪的)输出。
optind: 1
aflag detected
optind: 1
optind: 1
rflag detected
optind: 1
optind: 2
uflag detected
optind: 2
请注意,optind 不会从 aflag 递增到 rflag,但会从 rflag 递增到 uflag。
但是,当我使用格式 ./cfind -a -r -u 时,我得到以下(预期的)输出。
optind: 2
aflag detected
optind: 2
optind: 3
rflag detected
optind: 3
optind: 4
uflag detected
optind: 4
这是我想要的输出。
我的这个功能的代码如下。
#include "cfind.h"
#define OPTLIST "acdirstu" // list of valid options
void ProcOpt(int argc, char *argv[]) {
int opt = 0; // default value
opterr = 0; // prevent getopt from passing error message to stderr buffer
// char *filenm = NULL; // pointer to the path name
while((opt = getopt(argc, argv, OPTLIST)) != -1) {
switch (opt) {
case 'a':
fprintf(stdout, "optind: %i\n", optind);
aflag = true;
assert(aflag == true);
fprintf(stdout, "aflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 'c':
fprintf(stdout, "optind: %i\n", optind);
cflag = true;
assert(cflag == true);
fprintf(stdout, "cflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 'd':
fprintf(stdout, "optind: %i\n", optind);
dflag = true;
assert(cflag == true);
fprintf(stdout, "dflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 'i':
fprintf(stdout, "optind: %i\n", optind);
iflag = true;
assert(iflag == true);
fprintf(stdout, "iflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 'r':
fprintf(stdout, "optind: %i\n", optind);
rflag = true;
assert(rflag == true);
fprintf(stdout, "rflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 's':
fprintf(stdout, "optind: %i\n", optind);
sflag = true;
assert(sflag == true);
fprintf(stdout, "sflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 't':
fprintf(stdout, "optind: %i\n", optind);
tflag = true;
assert(tflag == true);
fprintf(stdout, "tflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
case 'u':
fprintf(stdout, "optind: %i\n", optind);
uflag = true;
assert(uflag == true);
fprintf(stdout, "uflag detected\n");
fprintf(stdout, "optind: %i\n", optind);
break;
default:
usage();
}
}
}
我做错了什么吗?我对 getopt()
以及它如何递增 optind
有什么误解吗?
谢谢。
最佳答案
getopt手册页说(强调我的):
The variable optind is the index of the next element to be processed in argv.
您的调用选项 -aru
都作为单个字符串包含在 argv[1]
中。
关于c - getopt() 函数 - optind 没有按预期递增/表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40353769/
这个问题已经有答案了: what's the difference between the printf and vprintf function families, and when should
我提出这个问题是因为没有太多关于如何为每个循环分配这个 optind。 Man page说: The variable optind is the index of the next element
我一直在学习命令行参数解析。关于这个已经有很长的线索了,我不想在这里挑起一个: Using getopts in bash shell script to get long and short com
根据我将选项传递给该程序的格式,变量 optind 将正确递增以反射(reflect)下一个选项值,否则不会递增。 如果我使用 ./cfind -aru,我会得到以下(奇怪的)输出。 optind:
我正在编写一个使用 getopt 函数的简单程序: #include #include #include int main(int argc, char **argv) { ch
我的shell脚本很简单,如下: while getopts "abc:" flag; do echo "$flag" $OPTIND $OPTARG done 我做了如下测
我意识到 shift 将 cli args 数组向左移动 n 个空间,n 的默认值为 1。这意味着我可以在 while 循环内使用 $1 shift 将数组的值分配给现有变量。我不太明白的是为什么在下
$OPTIND 在POSIX shell 中的定义,bash 是相当一致和直观的——它是下一个要读取的arg 的索引。然而,它在 zsh 中的行为非常令人费解,我找不到它的文档。 例子: # ./te
我是一名优秀的程序员,十分优秀!