2012-09-17 120 views
1
int main(int argc, char **argv){ 

    // If the user does not have the right amount of arguments exit the program and display message 
    if(!(argc >= 2)){ 
     printf("Usage: %s -l -c -w -L <filenames>"); 
     exit(-1); 
    } 

    size_t iscFlag = 0; 
    size_t islFlag = 0; 
    size_t iswFlag = 0; 
    size_t isLFlag = 0; 
    FILE *src; 
    puts("Work work"); 
    // For loop that checks for all the flags 
    int i; 
    for(i = 1; i < 5; i++){ 
     if(strcmp(argv[i], "-c") == 0){ 
      iscFlag = 1;    
     }else if(strcmp(argv[i], "-l") == 0){ 
      islFlag = 1; 
     }else if(strcmp(argv[i], "-w") == 0){ 
      iswFlag = 1; 
     }else if(strcmp(argv[i], "-L") == 0){ 
      isLFlag = 1; 
     } 
    } 

我試圖讓for循環來檢查標誌重新在UNIX型終端wc命令的簡單。任何人都知道for循環是怎麼回事?我得到了一個分段錯誤。還有更多的代碼,但我只是發佈了一部分代碼。ç段錯誤的for循環

在此先感謝。

+2

OH我是個白癡。我想我發現問題在發佈後的幾秒鐘內。我只是在做./wc -w文件名,所以循環檢查超出範圍。 –

+0

不要忘記printf的參數:你使用%s而不帶參數。下一個可能的段錯誤 – ckruse

回答

4

隨着

for(i = 1; i < 5; i++){ 
    if(strcmp(argv[i], "-c") == 0){ 

你應該確保argc >= 5,或strcmp會收到NULL指針時i == argc

1

您正在查看argv[i]當您的i一直到4,但您只檢查argc >= 2。我想你會得到一個段錯誤,只要有三個或四個參數,並且只有當你有五個或更多的參數時纔會有效。

0
for(i = 1; i < 5; i++){ 
     if(strcmp(argv[i], "-c") == 0){ 
      iscFlag = 1; 
      continue;   
     }else if(strcmp(argv[i], "-l") == 0){ 
      islFlag = 1; 
      continue; 
     }else if(strcmp(argv[i], "-w") == 0){ 
      iswFlag = 1; 
      continue; 
     }else if(strcmp(argv[i], "-L") == 0){ 
      isLFlag = 1; 
      continue; 
     } 
     break; 
    } 

固定它!

+0

這是如何解決它的?如果你給它一些非標誌參數和沒有標誌參數,你仍然會得到段錯誤。 –

+0

@JoãoMendes其實他是對的。只要它找到一個非標誌參數,就會跳出循環。然而,還有一個問題是他沒有解決問題:如果參數是標記,那麼就不會檢查他得到的空值,但是沒有太多的數據可以到達i == 4 –

+0

@AnalogFile你的意思是他會得到空值,如果參數*不是*標誌,但沒有多達到i == 4,這正是我所說的......! :p –