strcmp无法正确比较字符串

时间:2013-03-22 21:53:53

标签: c libc strcmp

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

我正在尝试使用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;
}

2 个答案:

答案 0 :(得分:2)

让我们来看看:

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

好的,我们假设strcmp0为“e”时正确返回argv[i]。我们假设这是因为

如果strcmp返回0会怎样?好吧,事情不仅仅停止,你的代码检查strcmp是否为真。是吗?我的通灵调试技巧告诉我你应该研究i != argc的第二部分。

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

答案 1 :(得分:1)

我建议您使用getopt (3)。这是广泛使用的符合POSIX的参数解析方法。

还有另一个与在Windows上实现getopt.h界面相关的问题:getopt.h: Compiling UNIX C-Code in Windows。重要的是回答(Xgetopt)所以可移植性应该不是这样。