Asking for Name and Displaying input - c

I relatively new to the C language and StackOverflow. I'm trying to write a simple C code that will prompt user for their name and then display it.
#include <stdio.h>
int main (void)
{
char name;
printf("Let's do this, please enter your name:");
scanf("%s", &name);
printf("Your name is %s", name);
return 0;
}
The code complies but after inputting the name, it displays Segmentation fault (core dumped).
Thank you for any help.

A very small mistake #Jackie_Legs. In the declaration of the variable name, You have declared it as a char. so it holds just one character.
The solution: choose an arbitrary size for your name, say 10 or 15 characters. and declare it as an array of the size.
char name[15];
No changes in any other part of the program. Also, you should omit the & symbol in the scanf for strings.
So just one change and your code should work.
Here is the updated code which would work:
#include <stdio.h>
int main (void)
{
char name[15];
printf("Let's do this, please enter your name:");
scanf("%s", name);
printf("Your name is %s\n", name);
return 0;
}

It is because your name variable can only store single character and you are trying to store more than one character which will lead to unpredictable behaviour of program (e.g. segmentation fault).
If you know max length of name, declare variable name as array of character such as
char name[20];
Here you can store name with max length of 19 character. You can decide length of array as per your requirement.

You need to declare a string as because a single letter is stored in char and multiple characters along with a null character at the end forms an String which can be anything like names, etc.
In your code you have taken char which stores only a single character but in order to store your name (which is a string) you will have to take char array along with the size of the array.
Replace char with char[size] where size is the size for the string that you need.
Here are the changes I made to your code:
#include <stdio.h>
int main (void)
{
char name[30];
printf("Let's do this, please enter your name:");
scanf("%s", name);
printf("Your name is %s", name);
return 0;
}

name is declared as char, which means it can contain only one character. It is not sufficient to contain a string of characters (which a name usually consists of). You need to declare a char array (an array of characters).
The size of the array should be at least 1 more than the largest name you want to read in.
The extra byte is to contain the null terminating character '\0'.
char name[SizeOfLargestName + 1];
And when you use scanf, you need not use & because now name points to the first byte of the array.
scanf("%s", name);

It is throwing error because of char name; char data type in C contain 1 character only in a variable. But your input is a string.
You need to change the declaration of the variable from char to char array.
char name[50];
printf("Let's do this, please enter your name:");
scanf("%s", name);
printf("Your name is %s", name);

Related

Storing user defined string into specific 2d array location in C

I am learning 2d arrays in C and im trying to get the user's name in C and store it in a 2d array. I found out that C don't have String data type and can only accepts string with data type char.
Now I am successful in getting the name from the user but i can't store the name into the separate 2d array. Here the code i tried:
#include <stdio.h>
#include <cstring>
int main()
{
int to=0,y=1,z=0,end=0;
char *ticketS[100][3];
char name[50];
printf("\nENTER PASSENGER'S NAME: ");
gets(name);
printf("%s",name);
strcpy(ticketS[z][0], name);
printf("%s", ticketS[z][0]);
return 0;
}
My input is: test name
My expected output is:
test name
test name
The actual output is:
test name
I can't seem to find any examples regarding my problem. Any help would be greatly appreciated.
Assuming you wanted to create 2 arrays with 100 chars each, and copy the name given by the user to the 2D array:
#include <stdio.h>
#include <string.h>
int main()
{
int to=0,y=1,z=0,end=0;
char ticketS[2][100];
char name[50];
printf("\nENTER PASSENGER'S NAME: ");
gets(name);
printf("%s\n",name);
strcpy(ticketS[0], name); // a for-loop would work as well
strcpy(ticketS[1], name);
printf("%s\n%s\n", ticketS[0], ticketS[1]);
return 0;
}
A few things you should pay attention to:
The indexing is wrong. char *ticketS[100][3]; creates 100 arrays with 3 chars each.
Using char *ticketS[100][3]; you just declare the variable, however, you don't initialize it
Null-terminator '\0' here plays a role. strcpy copies until it finds a Null-terminator. Therefore, to get your wanted result you would need to copy the string a few times, or use a different copying method (not strcpy).
This is also why I used %s twice with printf.
In the code exmaple I gave, ticketS[0] is a pointer to the 1st 100 char array.
Hope you find this useful.

trying to scan strings to 2 different elements of a struct in c

I tried to scan 2 different strings to 2 different elements of the same struct and I don't know why its not working.
This is my code:
struct qRegStudents{
char studID[6];
char studName[25];
};
typedef struct qRegStudents students;
int RegStudent() {
students Student;
char temp[6];
printf("Enter ID Number: ");
scanf(" %6s",Student.studID);
printf("Enter Name: ");
scanf(" %25s",Student.studName);
printf("%s",Student.studID);
return 0;
}
I input the student ID as "123456" and then the name as "josh". It prints "123456josh" as just the student ID
You didn't allocate enough space in the studID field to hold 6 characters plus the null terminator. Change the definition to:
struct qRegStudents{
char studID[7];
char studName[25];
};
Edit... Best to include a \n at the end of the printf string to make sure it gets flushed to stdout.
your program have a undefined behavior as there is no memory space you kept for '\0' at the end of studID and studName. Allocate enough memory location.
make it like
struct qRegStudents{
char studID[7]; /* plus 1 for terminating \0 char at end */
char studName[26];
};
Also do fflush(stdout) to clear stdout stream or use \n. for e.g
printf("%s\n",Student.studID);
printf("%s\n",Student.studName);
Always compile your code with warning enable flags. For e.g -Wall flag. It will tell you something about unused variable(temp[6]), read it.

Is this a misunderstanding of the functionality of strcpy()?

#include <stdio.h>
#include <string.h>
int main(void) {
int number_of_members;
char family[number_of_members][20][number_of_members][20];
char member_name[20];
char birth_state[20];
char family_last_name[20];
printf("What is the last name of the family?\n");
scanf("%s", &family_last_name);
printf("How many members do you want to create?\n");
scanf("%d", &number_of_members);
int const FAMILY_SIZE = number_of_members;
number_of_members = number_of_members -1;
printf("Enter the family member name: \n");
for(number_of_members;number_of_members>-1;number_of_members--)
{
scanf("%s", &member_name);
strcpy(family[number_of_members], member_name);
printf(" %d %s %s\n",number_of_members, member_name, family_last_name);
}
printf("%s, %s ", family[0], family[1]);
return 0;
}
Here is the output:(from Ideone.com)
Ideone.com with code
The input to this code is: Layne , 2 , tim , jim.
When run, it shows the correct index with the name in the array however, once out it will show the last entered name, jim, as family1 and family[0]. Am I not understanding how strcpy() works? or is it a logic error?Some assistance soon would be appreciated!
This is very very wrong
int number_of_members;
char family[number_of_members][20][number_of_members][20];
Because you haven't initialized number_of_members.
Because it doesn't make sense whatsoever, it's not possible that you really need this kind of array.
And yes, if you enable compiler warnings it will hit you in your nose with a stick, because
strcpy(family[number_of_members], member_name);
shouldn't even compile and is undefined behavior since the type of family[number_of_members], is an array of arrays of arrays of char.
strcpy can take an array of char's because it will be automatically converted to a char poitner, and provided that the contents of the array comply with what a c string is, then strcpy() will work correctly, in your case the behavior is undefined because almost surely the '\0' will never be found in the destination pointer.
instead of
int num_of_members;
char family[number_of_members][20][number_of_members][20];
which is not C code, do this
#define MAX_MEMBERS 20
char family[MAX_MEMBERS][20];
which creates a rectangular array of arrays each of 20 bytes long

Argument of type "char" is incompatible with parameter of type char*

I keep receiving this error and unsure how to fix it. I'm new to C programming and tried searching through the book/internet and couldn't find much help. I'm trying to create a program that will print a grade report using a loop and a sctructure
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Grades
{
char Name[20];
char Hrs;
int ID;
char ClassName[20];
char Grade;
char ClassID[6];
};
int main ()
{
struct Grades Transcript[6];
int classCnt = 0;
int vHrs=0;
char vGrade[2];
char vName[20], vCID[6], vClassName[20];
printf("Enter Students Name: ");
fgets(vName, 20, stdin);
do
{ printf("Enter Class ID; ");
fgets(vCID, 6, stdin);
strcpy_s(Transcript[classCnt].ClassID, vCID);
printf("Enter Class Name: ");
fgets(vClassName, 20, stdin);
strcpy_s(Transcript[classCnt].ClassName, vClassName);
printf("Enter Class Hours: ");
scanf("%d", &vHrs);
strcpy(Transcript[classCnt].Hrs, vHrs); //Problem occurs here
printf("Enter Class Grade: ");
scanf("%c", vGrade);
strcpy(Transcript[classCnt].Grade, vGrade); //Problem occurs here
classCnt++;
}while(classCnt<=6);
}
You actually have a number of problems here:
First, strcpy() is used to copy a string, if you have a character and you want it to assign it, you can simply assign it with the = operator. The strcpy() function is used when you have a character array you want to assign.
So your first problem
strcpy(Transcript[classCnt].Hrs, vHrs);
Hrs from your struct is just a char type, and vHrs is an int type. You can simply assign it like:
Transcript[classCnt].Hrs = vHrs;
However, an int can hold a lot more data than a char can, this is going to give you a warning about overflow and you should listen to it (depending on the implementation char holds -128 to 127, where as int holds −2,147,483,648 to 2,147,483,647). Decide what data type you really wanted here and either make Hrs an int or vHrs a char then just do the assignment.
Second problem:
scanf("%c", vGrade);
vGrade as a character array (it is made up of more than one character) that means you should assign it with the string format operator "%s", but when you do a string you should make the array long enough for the number of characters you want + 1 (for the NULL terminator).
Third problem:
strcpy(Transcript[classCnt].Grade, vGrade);
Grade is a char whereas vGrade is an array. Again, you have to make a decision of type, if you wanted a "string" of characters then you need to make them both arrays, if you wanted just a single character then change the type of vGrade and do a simple assignment with the = operator.
The thing you're running into here is a data typing error.
The structure member .Hrs is of type "char". The argument to strcpy is a "char *". Think of it like this: A char is a single 8 byte number representing a value in ASCII. A "char *" is a pointer to an array of characters (or a string in C language).
The Above is traditionally true,but , today it might be a unicode or multi-byte character string, as well. In either case, what you need is the assignment operator (=), not a strcpy.
So you're telling strcpy to look at a single value (char), not a string of values (char *) which is it expecting as it's argument. In this case, you can just copy the value of the integer you scanned in with scanf directly.
Transcript[classCnt].Hrs = vHrs;
and
Transcript[classCnt].Grade = vGrade;
If you're looking for the best book ever written, well in my opinion anyway :-), on C Language, check out:
C Programming Language (2nd Edition) - Looks like it's available on Amazon (or at you're favorite used book seller) for about $21 (USD).

Structures in C - not printing the whole string

Working on some self study in understanding structures in C.
I've made a small program that gets info from the user and then prints it back via functions.
I used two different methods of handing off the data using a couple examples in the C Primer Plus book.
What happens is that I can input the data but when it prints it back out the numeric data is ok but only the first character in each string is printed with garbage after it.
My code is below for review. I can't figure out what the issue is.
Any help would be great. Thanks!
#include <stdio.h>
#include <stdlib.h>
struct stats {
char name;
char city;
int wins;
int losses;
int draws;
};
void screen_print(char name,char city,int wins,int losses,int draws);
void team_input (struct stats * ptr);
int main()
{
struct stats team;
team_input(&team);
screen_print(team.name,team.city,team.wins,team.losses,team.draws);
return 0;
}
void screen_print(char name,char city,int wins,int losses,int draws)
{
// system("cls");
printf("==================================================\n");
printf("Name:\t\t\t%s\n",&name);
printf("City:\t\t\t%s\n",&city);
printf("Number of Wins:\t\t%d\n",wins);
printf("Number of Losses:\t%d\n",losses);
printf("Number of Draws:\t%d\n",draws);
printf("==================================================");
}
void team_input (struct stats * ptr)
{
system("cls");
printf("Enter Team name: ");
scanf("%s",&(ptr->name));
printf("\nEnter City:");
scanf("%s",&(ptr->city));
printf("\nEnter Wins:");
scanf("%d",&(ptr->wins));
printf("\nEnter Losses:");
scanf("%d",&(ptr->losses));
printf("\nEnter Draws:");
scanf("%d",&(ptr->draws));
}
name and city are single characters only: they are not strings.
scanf("%s",&(ptr->name)); is invalid and will be overwriting memory as an attempt is being made to read a string into a single char.
printf("%s", &name); expects name to be a null terminated string, so it will print the name char then random characters until a null is found somewhere in memory.
Change to:
struct stats {
char name[20]; /* Or greater than 20 if required */
char city[20];
int wins;
int losses;
int draws;
};
or dynamically allocate memory before populating if maximum possible length of name and city are unknown beforehand.
Change the printf() statements to:
printf("Name:\t\t\t%s\n", name);
printf("City:\t\t\t%s\n", city);
and scanf() statements to:
scanf("%s",ptr->name);
scanf("%s",ptr->city);
and screen_print() signature to:
void screen_print(char* name,char* city,int wins,int losses,int draws)
You're using single chars instead of arrays of chars. Both when inputting and outputting, the system is getting the memory address of a char, thinking that it's a string, and writing to/reading from it without any bounds check. So the adjacent memory is accessed as well, even though you didn't intend to.
You're lucky that your numeric data is input after the textual ones, or else even those would be wrong. Since a struct will usually occupy contiguous positions in memory, it's likely that they are being overwritten when you input your strings. That "garbage" you're seeing is in fact the data in the rest of your struct, plus anything that's "close" to it in memory, until an empty value is found (\0, interpreted as the null char).
In your struct, only one char is allocated for name and city. To hold a string, you need to specify the length at declaration.
struct stat {
char city[20];
char name[20];
...
}
String in C is quite tricky. It is an array of characters using an invisible '\0' for the ending. A string "hello" is actually 'h', 'e', 'l', 'l', 'o', '\0' in the memory.

Resources