Добавление getopt () для аргументов опции к уже существующей программе приводит к странному поведению.
Программа принимает строковый ввод, затем читает слова из файла (каждый на новой строке) и проверяет, является ли строканаходится в файле. Если это так, строка отправляется в файл Existing.txt и, если нет, она переходит в Non -isting.txt.Проблема с getopt () и странным поведением, которое он демонстрирует (опции -n и -e для изменения несуществующих и существующих файлов соответственно)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char word[80];
char word_in_file[80];
int ch;
FILE *existing = fopen("Existing.txt", "w"); //Open the existing and non_existing file streams
FILE *non_existing = fopen("Non-existent.txt", "w");
while((ch = getopt(argc, argv, "n:e:")) != -1){
switch(ch){
case 'n':
non_existing = fopen(optarg, "w");
break;
case 'e':
existing = fopen(optarg, "w");
break;
default:
fprintf(stderr,"Unknown option argument: %s", optarg);
return 1;
}
argc -= optind;
argv += optind;
}
printf("Enter ZA WARDSU:\n");
while (scanf("%79s[^\n]", &word)) { //Main loop that scans input
if(strcmp(word ,"exit") == 0){
printf("You are now done!\n");
break;
}
FILE *input = fopen(argv[1], "r"); // The stream is initialised here in order to reset it for every loop, the next loop just begins from where it last cut off
while ((fscanf(input, "%79s[^\n]\n", &word_in_file) != EOF)) { // loop that scans the input file
if(strcmp(word_in_file, word) == 0 ){ //if word is in the input file, print it to the existing file
fprintf(existing, "%s\n", word);
break;
}
}
if (strcmp(word, word_in_file) != 0 ) //if word isn't in the input file, print it to the non_existing file
fprintf(non_existing, "%s\n", word); //In main loop because it needs to do this check after it's gone through all the words
}
fclose(existing); //close some data streams
fclose(non_existing);
return 0;
}
Поэтому, когда я запускаю его таким образом,- ./check -n Nexname.txt -e Exname.txt inFile.txt
это просто segfaults, а стекдамп - что-то вроде Exception: STATUS_ACCESS_VIOLATION at rip=001801C189A
Затем я пытаюсь - ./check -nNexname.txt -eExname.txt inFile.txt
. На этот раз он не падает, но только создает и записывает в файл аргументов первого параметраи для второго он просто записывает в значение по умолчанию.
И если я пытаюсь сделать это только с одной опцией, подобной этой - ./check -nNexname.txt inFile.txt
, это просто останавливает программу после того, как я пишу в первом слове.
Редактировать: Это также не вызывает segfault, когда я делаю это таким образом ./check -n Nexname.txt -eExname.txt inFile.txt
Может кто-нибудь, пожалуйста, объясните мне причину этого поведения (и как это исправить).
Я знаю, что могу просто использовать аргументы основной функции, чтобы сделать то же самое, но я хотел опробовать функцию getopt (), чтобы ознакомиться с ней.