Я пытаюсь определить переменную глобального указателя, которую затем можно действительно установить в основной функции, как показано ниже. Однако я получаю ошибку сегментации каждый раз, когда пытаюсь использовать outputName
после этого. Я знаю, что это, вероятно, связано с установкой указателя, равного NULL
в начале... любая помощь о том, как я мог бы иметь глобальный указатель, который затем устанавливается в main, была бы очень полезна! Вот часть моего кода, которая дает мне ошибки:
char* outputName = NULL;
int isNumber(char number[]){
int i;
if (number[0] == '-')
i = 1;
while(number[i] != '\0'){
if (!isdigit(number[i]))
return 0;
i++;
}
return 1;
}
void catcher(int signo){
printf("The program is exiting early");
remove(outputName);
exit(1);
}
int main(int argc, char *argv[]){
if (argc != 4){
fprintf(stderr,"Incorrect number of arguments, must supply three.\n");
exit(1);
}
char* inputName = argv[1];
outputName = argv[2];
signal(SIGINT, catcher);
int result = isNumber(argv[3]);
if (result == 0){
fprintf(stderr, "Invalid maximum line length, please enter an integer\n");
exit(1);
}
int maxChars = (atoi(argv[3])) + 1;
if ((maxChars-1) < 1){
fprintf(stderr, "Invalid third maximum line length, please enter an integer greater than zero\
.\n");
exit(1);
}
FILE* inFile = fopen(inputName, "r");
if (inFile == NULL){
fprintf(stderr, "Error while opening %s.\n", inputName);
exit(1);
}
FILE* outFile = fopen(outputName, "w");
if (outFile == NULL){
fprintf(stderr, "Error while opening %s.\n", outputName);
exit(1);
}
char line[maxChars];
int done = 0;
while (!done){
char *readLine = fgets(line, maxChars, inFile);
if (readLine == NULL){
if (errno == 0){
done = 1;
} else {
fprintf(stderr, "Error when reading line from input file");
exit(1);
}
}
int len = strlen(line);
if (line[len-1] != '\n'){
line[len] = '\n';
line[len+1] = '\0';
char current = ' ';
while (current != '\n')
current = getc(inFile);
}
if (!done){
fputs(line, outFile);
if (errno != 0){
fprintf(stderr, "Error when writing line to output file");
exit(1);
}
}
}
return 0;
}
main()
? Вы выполнили базовую отладку, чтобы увидеть значениеargv[2]
? Вы проверилиargc >= 3
? - person John3136   schedule 07.12.2016outputName
действителен после приведенного выше кода, проблема в другом... - person John3136   schedule 07.12.2016outputName
после этого. - person danishansari   schedule 07.12.2016argv
вmain()
достаточно велика, поэтому маловероятно, что у вас возникнут проблемы сoutputName = argv[2];
— есть способы столкнуться с проблемами, но вы, вероятно, не задавали бы этот вопрос, если бы использовали их (atexit()
и т. д.) . - person Jonathan Leffler   schedule 07.12.2016printf()
символом новой строки, если хотите быть уверенным, что он появится; используйте такжеfflush(stdout);
, если хотите большей уверенности. Затем обратите внимание на как избежать использованияprintf()
в обработчике сигнала. Вероятно, вам это сойдет с рук — вряд ли это будет причиной ваших проблем, но поскольку вы не показываете никакого кода после присваиванияoutputName
, трудно понять, что вы делаете. Вы говорите, что используетеoutputName
, но единственное показанное место, где он используется, находится в обработчике сигнала. Вы прерываете его? - person Jonathan Leffler   schedule 07.12.2016isNumber
: это потому, чтоi
не инициализируется0
, когда число не начинается со знака-
. Я также добавляю строкуsignal(SIGSEGV, catcher);
в ваш код, чтобы перехватывать исключение, и обработчик работает нормально, перехватывая исключение ошибки сегментации. - person Joël Hecht   schedule 08.12.2016