Hey I'm working on a school project and I keep getting a segmentation fault error, which i've narrowed down (using printf) to the line bolded/underlined below.
It was working until I put in the function prototype void read_elements, and now I get and error whenever getchar() is used.
I am not including the entire program, as it is really long and I also dont want to get in trouble if a classmate decides to copy it all lol
Please help!
Code:
/* Homework */
/* File: hw.c
* Purpose:
* Author: Jonathon Taylor
* Date: February 1, 2010
*/
/* Preprocessor Directives */
#include <stdio.h>
#include <float.h>
#define FILE_NAME "table.txt"
/*----------------------------------------------------------------*/
//Defining part as a type of structure
typedef struct{
char name[15];
int number;
char symbol[5];
double weight;
float group;
int period;
char type[25];
char abbr[4];
} Part;
//Begin Central Coding
void read_elements(Part *part1, FILE *fp, char sym[]);
int main(void)
{
printf("\n\t\t****Periodic Table of Elements****\n\n");
int i;
char sym[5];
char req;
float gp;
//Defining part variable from typedef (part)
Part *part1,partm;
part1 = &partm;
FILE *fp;
fp = fopen(FILE_NAME, "r");
printf("Enter element symbol: ");
//Read in symbol request
i=0;
req = getchar(); //Segmentation fault occurs on this line
while(req != '\n')
{
sym[i] = req;
i++;
req = getchar();
}
sym[i] = '?';
//Reseting variable
i=0;
//Skipping title
for(i=0;i<=59;i++)
{
req = fgetc(fp);
}
i=0;
read_elements(part1,fp,sym);
return 0;
}
void read_elements(Part *part1, FILE *fp, char sym[])
{
int i,n,g;
char inp;
n=0;
double gp;
//MASTER WHILE LOOP GOES HERE//
while(n == 0)
{
//Reading in element
inp = fgetc(fp);
while(inp !=',')
{
(*part1).name[i] = inp;
inp = fgetc(fp);
i++;
}
(*part1).name[i] = '?';
i=0;
//Reading in number
fscanf(fp,"%d", &(*part1).number);
inp = fgetc(fp);
//Reading in symbol
inp = fgetc(fp);
i=0;
while(inp !=',')
{
(*part1).symbol[i] = inp;
inp = fgetc(fp);
i++;
}
(*part1).symbol[i] = '?';
i=0;
//Reading in weight
fscanf(fp,"%lf", &(*part1).weight);
inp = fgetc(fp);
//Reading in group
fscanf(fp,"%f", &(*part1).group);
inp = fgetc(fp);
//Reading in period
fscanf(fp,"%d", &(*part1).period);
inp = fgetc(fp);
inp = fgetc(fp);
//Reading in type
while(inp !=',')
{
(*part1).type[i] = inp;
inp = fgetc(fp);
i++;
}
(*part1).type[i] = '?';
i=0;
inp = fgetc(fp);
//Reading in abbreviation
while(inp !='\n')
{
(*part1).abbr[i] = inp;
inp = fgetc(fp);
i++;
}
(*part1).abbr[i] = '?';
i=0;
//End READING IN area of while loop
//Now TESTING FOR MATCH TO REQUESTED SYMBOL
if (sym[i] == (*part1).symbol[i])
{
while(sym[i]==(*part1).symbol[i])
{
if(sym[i] == '?')
{
i=0;
//Printing Element
printf("\nElement:\t");
while((*part1).name[i] != '?')
{
printf("%c",(*part1).name[i]);
i++;
}
i=0;
//Printing number
printf("\nNumber:\t\t%d", (*part1).number);
//Printing symbol
printf("\nSymbol:\t\t");
i=0;
while((*part1).symbol[i] != '?')
{
printf("%c",(*part1).symbol[i]);
i++;
}
i=0;
//Printing weight
g = (*part1).weight;
gp = (*part1).weight;
if( gp == g)
{
if(g <= 0)
{
g = g * (-1);
printf("\nAtomic Weight:\t(%d)",g);
}
else
{
printf("\nAtomic Weight:\t%d",g);
}
}
else{
if((*part1).weight <= 0)
{
(*part1).weight = (*part1).weight * (-1);
printf("\nAtomic Weight:\t(%f)",(*part1).weight);
}
else
{
printf("\nAtomic Weight:\t%f",(*part1).weight);
}
}
//Printing Group
g = (*part1).group;
gp = (*part1).group;
if( gp != g)
{
printf("\nGroup:\t\t%.2f", (*part1).group);
}
else
{
printf("\nGroup:\t\t%d",g);
}
//Printing Period
printf("\nPeriod:\t\t%d", (*part1).period);
//Printing Type
printf("\nType:\t\t");
while((*part1).type[i] != '?')
{
printf("%c",(*part1).type[i]);
i++;
}
i=0;
//Printing Abbr
printf("\nType Abbr:\t");
while((*part1).abbr[i] != '?')
{
printf("%c",(*part1).abbr[i]);
i++;
}
printf("\n");
i=0;
n=1;
break;
}
i++;
}
//END MASTER WHILE LOOP
}
}
}