Question: My C program is creating a segmentation fault, could you help me fix it? I've included what the output should be Sample Output: $ ./a.out
My C program is creating a segmentation fault, could you help me fix it? I've included what the output should be
Sample Output:
$ ./a.out
Error. Usage: ./a.out
$ ./a.out sample.txt
1. Find the number of zip codes in a state
2. Find a zip code
3. Exit
> 1
Enter the state: MO
The state of MO has 153 zip codes in the file.
1. Find the number of zip codes in a state
2. Find a zip code
3. Exit
> 11
Error not a valid option. Try again.
1. Find the number of zip codes in a state
2. Find a zip code
3. Exit
> 2
Enter the zip code you want to find: 444
No results found for zip code 444
1. Find the number of zip codes in a state
2. Find a zip code
3. Exit
> 2
Enter the zip code you want to find: 57349
Result found for zip code 57349:
City: Howard
State: SD
1. Find the number of zip codes in a state
2. Find a zip code
3. Exit
> 3
Program Terminate
CODE:
#include
#include
#include
#define MAXCITYNAME 30
#define MAXLINELENGTH 50
typedef struct n_
{
int zipCode;//A zip code that exists in the given city/state
char* city; //Will point to a city name
char state[3]; //A state abbreviation. Note that we need
//room for the NULL terminator!
struct n_* left; //connections to other nodes
struct n_* right;
}Node;
Node* importTree(char* filename);
Node* addNode(Node* root, Node* newNode);
int findStateCount(Node* root, char* state);
Node* findZipCode(Node* root, int zipCode);
void freeTree(Node* root);
void printMenu();
int main(int argc, char** argv)
{
Node* nodeIndex = NULL;
Node* zipCode = NULL;
if(argc != 2){
printf("Usage: %s
exit(1);
}
nodeIndex = importTree(argv[1] );
int selection;
printMenu();
scanf("%d", &selection);
while(selection <1 || selection> 3)
{
printf("Invalid selection, choose again: >");
scanf("%d", &selection);
}
while(selection !=3)
{
while(selection < 1 || selection >3)
{
printf("Invalid selection, choose again: >");
scanf("%d", &selection);
}
switch(selection)
{
case 1:
{
char state[3];
printf("Enter the state you want to search for: ");
scanf("%s", state );
printf("The state has %d results in the sample ", findStateCount( nodeIndex , state ));
break;
}
case 2:
{
int zip = 0;
printf("Enter the zip code you want to find: ");
scanf("%d", &zip );
zipCode = findZipCode( nodeIndex , zip );
if( zipCode == NULL )
{
printf("No results found for %d ", zip);
break;
}
else
{
printf("Result found for %d: City:%s State:%s ", zip, zipCode->city, zipCode->state);
break;
}
}
}
printMenu();
scanf("%d", &selection );
}
freeTree(nodeIndex);
return 0;
}
/**********************************************************************************************************************/
Node* addNode(Node* root, Node* newNode)
{
if(newNode == NULL){
printf(" NULL pointer passed to addNode()");
exit(1);
}
if(root == NULL) {
return newNode;
} else {
// large zip codes on the right
if(newNode->zipCode > root->zipCode) {
root->right = addNode(root->right, newNode);
}
// lil zip codes on the left
if(newNode->zipCode < root->zipCode) {
root->left = addNode(root->left, newNode);
}
}
return root;
}
//**********************************************************************************************************************
int findStateCount(Node* root, char* state)
{
// if the tree is empty, theres no instances of the state
if(root == NULL) {
return 0;
} else {
if(strcmp(root->state, state) == 0) {
return 1 + findStateCount(root->left, state) + findStateCount(root->right, state);
}
}
return findStateCount(root->left, state) + findStateCount(root->right, state);
}
//************************************************************************************************************************
Node* findZipCode(Node* root, int zip)
{
if(root == NULL)
{
return NULL;
}
else if(root->zipCode == zip)
return root;
else if(zip < root -> zipCode)
return findZipCode(root->left, zip);
else
return findZipCode(root -> right, zip);
}
//***********************************************************************************************************************
void freeTree(Node* root)
{
if(root == NULL) //Base case//
{
free(root);
return;
}
freeTree( root->left );
freeTree( root->right );
free( root->city );
free( root );
}
//************************************************************************************************************************
Node* importTree(char* filename)
{
Node* root = NULL; //Initializes value for root //
FILE* fp = fopen("input.txt", "r"); /* opens input file, fp = the address of file */
if(!fp) /* error check for if the file is not opened properly or not at all */
{
printf("Error opening file. ");
return NULL;
}
while(!feof(fp)) /* while loop breaks when feof reaches the end of the file */
{
Node* new =(Node*)malloc(sizeof(Node)); /* allocates memory for a new node */
if(!new) /* error check for if malloc fails */
{
printf("Failed to allocate memory. Ending read. ");
exit(1);
}
new->city =malloc(sizeof(char)*MAXCITYNAME);
if(!(new->city))
{
printf("Failed to allocate memory. Ending read. ");
exit(1);
}
new->left = NULL;
new->right = NULL;
char* line = malloc(sizeof(char)*MAXLINELENGTH);
if(!line)
{
printf("Failed to allocate memory. Ending read. ");
exit(1);
}
if(fgets(line, MAXLINELENGTH, fp) == NULL)
{
if(!feof(fp))
{
printf("File reading ended prematurely. Check for errors in the file. ");
exit(1);
}
free(new->city);
free(line);
free(new);
fclose(fp);
break;
}
char* tmp = strtok(line, ",");
new->zipCode = atoi(tmp);
tmp = strtok(NULL, ",");
strcpy(new->city, tmp);
new->city[strlen(tmp)+1] = '\0';
tmp = strtok(NULL, " ");
strcpy(new->state, tmp);
new->state[2] = '\0';
root = addNode(root, new);
if(!root)
{
printf("Root of tree is still NULL! Ending read. ");
exit(1);
}
free(line);
}
return root;
}
//**************************************************************************************************************************
void printMenu()
{
printf("1: Find number of Zip codes in a state 2:Find zip code 3:exit ");
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
