2013-03-22 53 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