使getopt()处理argv[0]

3
我试图通过字符串分词并将标记存储在以NULL结尾的char*数组中,来模拟普通函数的main()函数行为。
一切都很好,除了getopt()。它不会重新排列argv[0],因为它希望第一个参数是程序名称。但对于我的函数,argv[0]不是程序名称。我想让getopt()也重新排列argv[0](非选项)。我该怎么做?

你为什么想这样做?这是对 getopt() 的误用。 - alk
3个回答

3

getopt(3) 使用一个全局变量 optind(选项索引)来跟踪其在 argv 中的进度,并将其初始化为1。尝试在读取选项之前设置 optind = 0


是的,我尝试过了。在第一次调用getopt()之前,我将optind = 0设置了。但是没有起作用。 - tez
那结果是什么? - chrylis -cautiouslyoptimistic-
即使将optind = 0,结果仍然相同。argv [0]元素在相同的位置。 - tez
当您调用它时,它返回哪些值? - chrylis -cautiouslyoptimistic-

0

尝试使用

c = getopt(argc + 1, argv - 1, "xyz")

编辑:正如下面指出的那样,这是一种hack。但我很想看看有哪台机器它不起作用。


我倾向于说argv - 1会引发未定义的行为。因此,我认为这种解决方案是一种肮脏且不可移植的hack。 - alk
只有在访问它时才会生效。我怀疑 getopt 是否会这样做。 - Tom Tanner
1
@TomTanner 技术上我认为你错了。标准规定,指针加或减操作得到的结果超出数组边界是未定义行为,即使您随后什么都不做,除了特殊情况:在数组末尾之后一格的位置。实际上,在大多数地方它可能会正常工作,但从标准的角度来看,这是未定义行为。 - Nigel Harper
@TomTanner:我对此表示怀疑。请查看这个问题的答案:https://dev59.com/nGMl5IYBdhLWcg3wuI3p - alk

0

尽管@Tom Tanner提出的hack对某些系统有效,但它在我需要让其工作的目标系统上无法编译。我发现的另一个解决方法是用一个虚拟字符串替换我的argv[]数组中的第一个参数,并使用getopt()函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接