sameed hussain
sameed hussain

Reputation: 215

How to assign a string to struct variable in C?

I am unable to figure out how to assign a string to a struct variable using only <stdio.h> header file.

The following code gives me an error and I am unable to fix it.

#include <stdio.h>
 struct Student
{
    char name[50];
};
int main()
{
   struct Student s1;
   printf("Enter studen's name:\n");
   scanf("%s",s1.name);
   printf("Name : \n",s1.name);
   s1.name={"Hussain"};
   printf("Name : \n",s1.name);
}

It gives the following error while compilation:

test.c: In function 'main':
test.c:12:12: error: expected expression before '{' token
    s1.name={"Hussain"};
            ^

I have tried initializing it in the following way:
s1.name="Hussain";
But this doesn't work too.
I could avoid this by the use of pointers as follows:

#include <stdio.h>
 struct Student
{
    char *name;
};
int main()
{
   struct Student s1;
   printf("Enter studen's name:\n");
   scanf("%s",s1.name);
   printf("Name : %s\n",s1.name);
   s1.name="Hussain";
   printf("Name : %s\n",s1.name);
}

This code works perfectly fine with no errors.
But I want to know where exactly I am doing wrong with the array, which is making my code not work.

Upvotes: 1

Views: 2531

Answers (3)

Zakk
Zakk

Reputation: 2063

If you can't use <string.h>, then you have to implement your own version of strcpy():

void copystring(char *dest, const char *src)
{
    const char *p = src;
    while (*p) {
        *dest = *p;
        p++;
        dest++;
    }
    *dest = '\0'; // Null-terminate string (as pointed by @Ted)
}

Make sure that dest has enough space to hold src.

Also, avoid using scanf() in your code. Use fgets() as an alternative.

EDIT: As pointed by Jabberwocky, fgets() leaves \n read in the string. But since using <string.h> is not allowed, you have to implement your own function to replace it with a null-terminator:

int findchar(const char *str, char c)
{
    int pos;
    for (pos = 0; str[pos]; ++pos)
        if (str[pos] == c)
            return pos;
    
    return -1;
}

You can use it like:

char str[100];
if (!fgets(str, sizeof str, stdin)) {
    // fgets() failed. Do something.
} else {
    int nwln = findchar(str, '\n');
    if (nwln == -1) {
        // You probably entered more than 100 characters
        // because \n couldn't be found.
    } else {
        str[nwln] = '\0';
    }
}

Upvotes: 1

dbush
dbush

Reputation: 223972

A char array (and arrays in general) can't be assigned a value directly, only initialized. To write a string into a char array, use strcpy.

strcpy(s1.name, "Hussain");

The latter code where the name member is a pointer works for the assignment because the pointer is assigned the start address of the start of the string constant. Also note that you can't (at least not yet) use strcpy in that case because s1.name doesn't point anywhere. You would first need to allocate memory using malloc, or perform both steps at once using strdup. Also for this reason, you can't yet use scanf until you allocate memory.

If you're not allowed to use functions from string.h, then you would need to write the characters into the array one at a time, and then write a terminating null byte at the end.

Upvotes: 4

Vlad from Moscow
Vlad from Moscow

Reputation: 310990

Arrays do not have the assignment operator. So these assignment statements

s1.name = { "Hussain" };
s1.name = "Hussain";

are invalid.

You could use the standard C string function strcpy to copy elements of the string literal to the array s1.name like

#include <string.h>

//...

strcpy( s1.name, "Hussain" );

If you may not use standard string functions then you need to write a loop as for example

const char *p = "Hussain";

for ( char *t = s1.name; ( *t++ = *p++ ) != '\0'; );

Or

for ( char *t = s1.name, *p = "Hussain"; ( *t++ = *p++ ) != '\0'; );

Pay attention to that the second your program has undefined behavior. The pointer s1.name is not initialized and does not point to a valid object of an array type. So the call of scanf in this code snippet invokes undefined behavior.

struct Student s1;
printf("Enter studen's name:\n");
scanf("%s",s1.name);

Upvotes: 3

Related Questions