我正在编写一个简单的程序,它从用户那里获取参数并处理它们。 我在argv中的参数是二维数组。但是当我运行程序时,我得到垃圾值和分段错误错误。我已经尝试使用argc作为终止条件并且它有效。但我想只使用指针。 指针在这里做错了什么。
#include<stdio.h>
int main( int argc, char *argv[])
{
while (++(*argv))
{
if ( **argv == '-' )
{
switch (*argv[1])
{
default:
printf("Unknown option -%c\n\n", (*argv)[1]);
break;
case 'h':
printf("\n option h is found");
break;
case 'v':
printf("option V is found");
break;
case 'd':
printf("\n option d is found");
break;
}
}
printf("\n outside while : %s", *argv);
}
}
程序运行:
./a.out -h -v -d
谢谢
答案 0 :(得分:6)
如果要遍历查找终止空指针的程序参数,则外部循环应为
while (*++argv)
不是
while (++*argv) // <- incorrect!
你的代码中有。
您的switch
表达式写错了。虽然您的意图很明确,但您的实现会忽略运算符优先级。
这个
switch (*argv[1]) { // <- incorrect!
实际应该是
switch ((*argv)[1]) {
之前的if
if (**argv == '-')
很好,但因为它相当于
if ((*argv)[0] == '-') // <- better
也许您应该以这种方式重写它,只是为了与switch
保持一致。
答案 1 :(得分:2)
您的最终问题是运营商优先级。当没必要时,不要试图聪明。 *
运算符无法正常工作。我使用[0]
重写了您的代码,现在它可以正常工作:
#include <stdio.h>
int main(int argc, char *argv[])
{
while ((++argv)[0])
{
if (argv[0][0] == '-' )
{
switch (argv[0][1]) {
default:
printf("Unknown option -%c\n\n", argv[0][1]);
break;
case 'h':
printf("\n option h is found");
break;
case 'v':
printf("option V is found");
break;
case 'd':
printf("\n option d is found");
break;
}
}
printf("\n outside while : %s", argv[0]);
}
}
答案 2 :(得分:0)
argv
是一个字符串数组。 argv[0]
是程序名称,在您的情况下为a.out
。您的选项从argv[1]
开始。因此,您需要将argv
从1迭代到argc-1
以获取选项。