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

Я пытаюсь создать простой цикл, который проверяет флаги для воссоздания команды wc в терминале типа UNIX. Кто-нибудь знает, что происходит с циклом for? На нем возникает ошибка сегментации. Существует больше кода, но я просто размещаю его часть.C Сегментация Неисправность для цикла

Заранее спасибо.

+2

OH Я идиот. Я думаю, что выяснил, в чем проблема - секунды после публикации. Я просто делаю ./wc -w имя файла, и поэтому цикл проверяет границы. –

+0

Не забывайте аргументы printf: вы используете% s без аргумента. Следующий возможный segfault – ckruse

ответ

4

С

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

вы должны убедиться, что argc >= 5 или strcmp получит NULL указатель при i == argc.

1

Вы просматриваете argv[i], когда ваш i проходит до четырех, но вы проверяете только argc >= 2. Я предполагаю, что вы получите segfault всякий раз, когда у вас есть три или четыре аргумента, и он будет работать только тогда, когда у вас есть пять или больше.

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

Как это исправить? Если вы дадите ему пару не-флаговых аргументов и аргументов без флага, вы все равно получите segfault. –

+0

@ JoãoMendes На самом деле он прав. Как только он находит аргумент non flag, он выходит из цикла. Однако есть еще одна проблема, которую он не исправляет: нет проверки на нуль, который он получит, если аргументы являются флагами, но не так много, чтобы добраться до i == 4 –

+0

@AnalogFile Вы имеете в виду нуль, который он получит, если аргументы * не являются * флагами, но не так много, чтобы добраться до i == 4, что именно то, что я сказал ...! : p –

Смежные вопросы