2013-03-22 51 views
-2

我在C.STRCMP未能正确

使用 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; 
} 
+1

当然你没有忘记'我++;'? – 2013-03-22 21:54:40

+3

粘贴完整的代码而不是两个摘录,没有解释它们如何连接。 – 2013-03-22 21:55:04

+0

不,我用调试器跟踪我的价值,这很好。我会发布其余的代码。 – Atirag 2013-03-22 21:56:36

回答

1

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

另外还有一个问题涉及在windows上实现getopt.h接口:getopt.h: Compiling UNIX C-Code in Windows。重要的是它被回答(Xgetopt),所以可移植性应该不是一个例子。

+3

getopt不是C标准的一部分。它的POSIX。 – 2013-03-22 21:57:20

+2

@cli_hlt POSIX定义了“POSIX C标准库”。 – 2013-03-22 21:58:41

+4

IEEE POSIX与ANSI C标准无关。谷歌会向你解释。 @罗曼,你应该在那里澄清你的答案。 – 2013-03-22 22:01:13

2

让我们来看看这个:

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

好了,让我们假设strcmp正确返回0argv[i]是 “E”。我们将假设这是因为它的极其不太可能在您的库实现strcmp中存在一个错误。

如果strcmp返回0,会发生什么情况?那么,事情不会停止,您的代码将检查i != argc是否为真。是吗?我的心理调试技巧告诉我,你应该看看while的第二部分。

您可能还想指出,您的代码可能可能访问argv[argc],即NULL。如果strcmp在输入为NULL时是宽松的,那么您可能会很幸运,但这是一个您应该修复的错误。

+2

我会补充说'while(我 2013-03-22 22:09:32

+0

嗯,好吧,但我使用“||”在while语句中,这段时间的第一部分应该独立于第二部分行事吗?我将删除第二部分来检查它 – Atirag 2013-03-22 22:10:39

+1

标准说:“argv [argc]应该是空指针。” – 2013-03-22 22:13:14