【问题标题】:strcmp failing to compare strings properlystrcmp 无法正确比较字符串
【发布时间】:2013-03-12 21:46:40
【问题描述】:

我在 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;
}

【问题讨论】:

  • 确定没有忘记i++;?
  • 粘贴完整的代码,而不是两个摘录,不解释它们是如何连接的。
  • 不,我正在使用调试器跟踪 i 的值,这很好。我将发布其余的代码。

标签: c libc strcmp


【解决方案1】:

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

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

【讨论】:

  • getopt 不是 C 标准的一部分。它的 POSIX。
  • @cli_hlt POSIX 定义了“POSIX C 标准库”。
  • IEEE POSIX 与 ANSI C 标准无关。谷歌会向你解释。 @Roman 你应该在那里澄清你的答案。
  • @cli_hit 即使在原始帖子中,您也是在哪里找到“ANSI”这个词的(好吧,现在我完全删除了“标准”这个词以不喂食巨魔)?是的,它是 POSIX,不是标准的吗?特别适合你:en.wikipedia.org/wiki/C_POSIX_library
  • @RomanNikitchenko POSIX 是一个标准,它定义了兼容 POSIX 的操作系统。 POSIX 兼容操作系统(!)需要 POSIX C 库。例如,*nix 就是这样一个操作系统。 OTOH,Windows 不是。 ANSI C 是 C 编程语言的标准。符合 ANSI C 标准的程序可以在任何具有符合 ANSI C 标准的编译器的系统上运行。 ANSI C 也有一个标准库,它和语言描述一起定义了编程语言 C。重要的是不要把这些东西混在一起。
【解决方案2】:

让我们看看这个:

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

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

如果strcmp 返回 0 会怎样?好吧,事情不仅会停止,您的代码还会检查 i != argc 是否为真。是吗?我的心理调试技能告诉我,您应该查看while 的第二部分。

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

【讨论】:

  • 我要补充一点,while(i &lt; argc &amp;&amp; strcmp(argv[i], "-e") != 0) 在这里可能是一个更好的选择。
  • 嗯好的,但我使用的是“||”在while语句上,所以while的第一部分应该独立于第二部分,不是吗?我将删除第二部分以检查它
  • @Omri:酷,你每天都能学到新东西。谢谢,我会相应地编辑。
  • @Atirag 想一想|| 是如何运作的——如果左侧为假,则检查右侧,如果左侧为真,则不检查右侧。
猜你喜欢
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多