So I have a struct, and within that struct I have a array of chars that is meant to store a phone number. Format being xxxxxxxxxx (with x being a digit from 0-9). Then, I'm running a for loop to format the display of those ten digits while printing.
#include <stdio.h>
void clear(void);
struct Student {
int idNumber;
char firstName[25];
char lastName[25];
char cellNumber[15];
char grade, grade2;
char semester[11], semester2[11];
char course[10], course2[10];
};
int main() {
struct Student studentArr[2];
for (int x = 0; x < 2; x++){
printf("For student %d...\n", x+1);
printf("Enter student number: \n");
scanf("%d", &studentArr[x].idNumber);
printf("%d", studentArr[x].idNumber);
printf("Enter student's first name: \n");
scanf("%s", studentArr[x].firstName);
printf("%s", studentArr[x].firstName);
printf("Enter student's last name: \n");
scanf("%s", studentArr[x].lastName);
printf("%s", studentArr[x].lastName);
printf("Enter student's cell number: \n");
scanf("%s", studentArr[x].cellNumber);
printf("%c", &studentArr[x].cellNumber[1]);
printf("(");
//print("%s", studentArr[x].cellNumber);
for(int i = 0; i < 3; i++) {
printf("%s", &studentArr[x].cellNumber[i]);}
printf(")");
for(int i = 3; i < 6; i++){
printf("%s", &studentArr[x].cellNumber[i]);}
printf("-");
for(int i = 6; i < 10; i++){
printf("%s", &studentArr[x].cellNumber[i]);}
printf("Enter course %d: \n", x+1);
scanf("%s", studentArr[x].course);
printf("%s", studentArr[x].course);
printf("Enter semster for course %d: \n", x+1);
scanf("%s", studentArr[x].semester);
printf("%s", studentArr[x].semester);
printf("Enter letter grade for course %d: \n", x+1);
scanf("%s", studentArr[x].grade);
printf("%s", studentArr[x].grade);
clear();
}
}
void clear(void) {
while(getchar() != '\n');
}
Here is the output:
As you can see, the output for the phone number is completely messed up, also I'm ending up with a segmentation fault.
EDIT: Switched the %s to %c and now am getting this output and not prompt for user entry: Letters instead of numbers
You should ensure your compiler warnings are on. If you didn't get warnings, then you should ensure you're using a good compiler like Clang.
When I compiled your code, I got these errors:
$cc phone.c -o phone
phone.c:34:22: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
printf("%c", &studentArr[x].cellNumber[1]);
~~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
%s
phone.c:52:21: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
scanf("%s", studentArr[x].grade);
~~ ^~~~~~~~~~~~~~~~~~~
phone.c:53:22: warning: format specifies type 'char *' but the argument has type 'char' [-Wformat]
printf("%s", studentArr[x].grade);
~~ ^~~~~~~~~~~~~~~~~~~
%c
3 warnings generated.
These clue you in to what mistakes you may have made.
In this case, you got a little confused between characters and strings, along with some other issues.
Fixing your character/string issues:
You made the error of passing a pointer to a character where you should've just passed the char itself. To fix this, you should delete the ampersand, changing this:
printf("%c", &studentArr[x].cellNumber[i]);
to this:
printf("%c", studentArr[x].cellNumber[i]);
for each of your three lines.
You also probably want to print a '1' first, not the index 1 of the phone string (otherwise input 5555555555
outputs 5(555)555-5555
).
So, change this:
printf("%c", &studentArr[x].cellNumber[1]);
to this:
printf("%c", '1'); // or printf("1");
After you do #1 and #2, you will get output like this:
gregEnter student's last name:
schmit
schmitEnter student's cell number:
6306089561
1(630)608-9561Enter course 1:
There are still errors in your code. From here, you should compile and inspect warnings, and then search for the errors you get, as they are well documented.