Ошибка сегментации при использовании scanf или fgets на языке Си
У меня есть проект в одном из моих классов программирования по созданию игры из 20 вопросов, которая рекурсивно строит создание бинарного дерева выборов, которое следует компьютеру, когда вы отвечаете на вопросы. Файлы Node, которые я сделал, были протестированы и работают нормально. Тем не менее, я могу опубликовать его при необходимости, но я считаю, что моя проблема где-то в моих основных файлах.
Ошибка запуска программы:
Is it a dog?
Enter "y" for yes and "n" for no: n
YOU WIN!!!
What were you thinking of? fish
Please give me a yes or no questions to distinguish dog from fish: does it have scales?
Segmentation fault (core dumped)
Программа работает абсолютно нормально и работает, как ожидалось, пока пользователь не введет отличительные вопросы.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Node.h"
#define BUFF 1
//prototype methods
void startGame();
void askQuestion(Node* currentNode);
//Declare variables
Node* startNode;
Node* moveNode;
Node* makeNode;
char ans;
char newQuestion[1000];
char playerObj[1000];
void startGame() {
//Allocate memory for altering decision tree when new questions are added
startNode = (Node*) malloc(BUFF * sizeof(Node));
moveNode = (Node*) malloc(BUFF * sizeof(Node));
makeNode = (Node*) malloc(BUFF * sizeof(Node));
//Make root node of tree
setQuestion("Is it a dog?", startNode);
setObjName("dog", startNode);
}
void askQuestion(Node* currentNode) {
printf("%s\n", getQuestion(currentNode));//Ask user a question
printf("Enter \"y\" for yes and \"n\" for no: ");//Prompt user for response
scanf("%c", &ans);//Get user character from keyboard
fflush(stdin);//Flush standard input to clear newline character
//If the computer is right computer wins
if((isObjNode(currentNode)) & (ans == 'y')){
printf("COMPUTER WINS!!!");
//this section will later start another game using the current decision tree
//Move to next yes node in tree
}else if(!(isObjNode(currentNode)) & (ans == 'y')){
askQuestion(currentNode->yesPointer);
//If at leaf node and computer is wrong notify user and expand tree
}else if((isObjNode(currentNode)) & (ans == 'n')){
printf("YOU WIN!!!\n");
printf("What were you thinking of? ");
scanf("%s", &playerObj);//Get what user was thinking of
fflush(stdin);//Flush newline character
printf("Please give me a yes or no questions to distinguish %s from %s: ",currentNode->objName, playerObj);
fflush(stdout);
scanf("%s", &newQuestion);
//I also tried:
//fgets(newQuestion, sizeof(newQuestion), stdin);
fflush(stdin);
//PROGRAM SEGMENTATION FAULTS
setQuestion(strcat(strcat("Is it a ", playerObj), "?"), makeNode);
setObjName(playerObj, makeNode);
moveNode = currentNode;
printf("If the answer would be %s, what would the answer be y for yes, n for no?",playerObj);
scanf("%c", &ans);
fflush(stdin);
setQuestion(newQuestion, currentNode);
if(ans == 'y'){
setYesNodeRef(currentNode, makeNode);
setNoNodeRef(currentNode, moveNode);
}else if(ans == 'n'){
setYesNodeRef(currentNode, moveNode);
setNoNodeRef(currentNode, makeNode);
}
}else if(!(isObjNode(currentNode)) & (ans == 'n')){
askQuestion(currentNode->noPointer);
}
}
int main() {
startGame();
askQuestion(startNode);
}
Итак, вкратце, мой вопрос в том, что является причиной ошибки сегментации?
Я просмотрел несколько обновлений сканфа и попробовал fgets также на основе некоторых постов и уроков. fgets даже не позволяет мне вводить пользовательский ввод, когда код точно такой же, просто меняя scanf на fgets для ввода newQuestion, если он представляет какой-либо интерес.
Спасибо всем заранее за любой вклад или рефералов к любой информации по аналогичным вопросам.
1 ответ
Еще раз спасибо всем.
Строка, которая гласит:strcat(strcat("Is it a ", playerObj), "?")
Был причиной проблемы, с которой я столкнулся. Когда я полностью закомментировал строку, программа смогла перейти к дальнейшим пунктам программы. И я ищу лучшие способы сделать это, как упоминает пользователь MikeCAT.