2012-09-17 6 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; 
     } 
    } 

J'essaie de créer une simple boucle for qui vérifie les drapeaux pour recréer une commande wc dans un terminal de type UNIX. Quelqu'un sait quoi de neuf avec la boucle for? Je reçois un défaut de segmentation dessus. Il y a plus de code mais j'en poste juste une partie.C Erreur de segmentation pour la boucle

Merci d'avance.

+2

OH Je suis un idiot. Je pense avoir découvert le problème après quelques secondes. Je fais juste ./wc -w nom de fichier et donc la boucle vérifie au-delà des limites. –

+0

Ne pas oublier les arguments du printf: vous utilisez% s sans argument. Next segfault possible – ckruse

Répondre

4

Avec

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

vous devez vous assurer que argc >= 5, ou strcmp recevra un pointeur NULL quand i == argc.

1

Vous regardez argv[i] lorsque votre i va jusqu'à quatre, mais vous ne vérifiez que pour un argc >= 2. J'imagine que vous obtiendrez un segfault chaque fois que vous avez trois ou quatre arguments, et cela ne fonctionnera que lorsque vous en avez cinq ou plus.

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

Fixé avec ça!

+0

Comment cela résout-il? Si vous lui donnez quelques arguments non-flag et aucun argument flag, vous allez toujours obtenir le segfault. –

+0

@ JoãoMendes En fait, il a raison. Dès qu'il trouve un argument non flag, il sort de la boucle. Cependant il y a un autre problème qu'il ne corrige pas: il n'y a pas de vérification de la valeur nulle qu'il obtiendrait si les arguments sont des drapeaux, mais pas autant pour obtenir i == 4 –

+0

@AnalogFile Vous voulez dire le null qu'il obtiendrait si les arguments * ne sont pas * des drapeaux, mais pas autant pour arriver à i == 4, ce qui est exactement ce que j'ai dit ...! : p –