-2

strcmp在 C中使用时遇到问题。

我正在尝试使用比较程序的参数,strcmp但即使字符串相同,它也不起作用。这是代码的一部分。

while(strcmp(argv[i], "-e") != 0)

所以对于 i = 11 如果我打印argv[i]我得到的值

printf("String %s i %d", argv[i],i);

>> String -e i 11

但时间还在继续。任何想法为什么会发生这种情况?

代码:

while(strcmp(argv[i], "-e") != 0 || i != argc)
{
    printf("String %s i %d", argv[i],i);
    if(!isdigit((unsigned char)*argv[i]) && strcmp(argv[i], "-t") != 0)
    {
        archivo = fopen(argv[i] , "r");
        TOT_IMG = TOT_IMG + 1;
        for(t=0;t<NUM_FUNC_TRAZO;t++)
        {
            for(d=0;d<NUM_FUNC_DIAMETRICA;d++)
            {
                for(c=0;c<NUM_FUNC_CIRCO;c++)
                {
                    if (fscanf(archivo, "%s",el) != EOF)
                    {
                        par->vector_circo[t][d][c] = strtod(el,NULL);
                        par->clase = clase;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        par_temp = par;
        par->siguiente = (parametros_lista) malloc(sizeof(parametros_elem));
        par = par->siguiente;
        par->anterior = par_temp;
    }
    else
    {
        if(strcmp(argv[i], "-t") != 0)
        {
            clase = atoi(argv[i]);
            CLASES = CLASES + 1;
        }
    }
    i = i + 1;
}
4

2 回答 2

2

让我们看看这个:

while(strcmp(argv[i], "-e") != 0 || i != argc)

好的,所以让我们假设在“e”时strcmp正确返回。我们会假设这是因为在您的库实现中不可能存在错误。0argv[i]strcmp

如果strcmp返回 0 会发生什么?好吧,事情不仅会停止,您的代码还会检查是否i != argc为真。是吗?我的通灵调试技能告诉我,你应该研究while.

您可能还需要注意,您的代码可能会访问argv[argc],即NULL. strcmp如果输入为 lenient 时,您可能会很幸运NULL,但这是您应该修复的错误。

于 2013-03-22T22:06:47.077 回答
1

我宁愿推荐你使用getopt (3)。这是一种广泛使用的符合 POSIX 的参数解析方法。

还有另一个与getopt.h在 windows 上实现接口有关的问题:getopt.h: Compiling UNIX C-Code in Windows。重要的是它得到了回答(Xgetopt),所以便携性不应该是一个案例。

于 2013-03-22T21:56:14.683 回答