2012-09-17 66 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 –