user1005284
user1005284

Reputation:

Strings in c programming

why am i unable to compile the program containing the code

char name[10];
name= "Rajesh";

While i am able to compile a program with

char name[10]="Rajesh";

Upvotes: 4

Views: 468

Answers (7)

Shishir Boxey
Shishir Boxey

Reputation: 9

char name[10];
name= "Rajesh";

Here name is an array of characters. The simple name is basically pointer to first element of array and it cannot be assigned with some value like it's done in above statement.

My point is

char name[10]; name= "Rajesh";

Explanation: This is not the correct declaration of array. Strings are nothing but collection of characters terminated with '\0' operator. So, the array index (which in this case is 'name', basically points to address of 1st character in array i.e name holds the address of character 'R' in 'Rajesh'.

enter image description here

If you want to initialize like as mentioned above, the better approach could have been:

char name[10]; *name= "Rajesh";

Now, the above declaration won't throw any error, but still it will throw warning, like:

assignment makes integer from pointer without a cast [-Wint-conversion] *name = "Rajesh"

Upvotes: 1

Alok Save
Alok Save

Reputation: 206508

You cannot assign values to string arrays by using assignment.
In C, You can only initialize arrays not assign them, a array of characters is no exception for this rule.

You will need to use string copying functions like strcpy or strncpy and so on.

However you can encapsulate a string in a struct and simulate this:

typedef struct Yourstring Yourstring; 
struct Yourstring 
{ 
    char a[24]; 
};  
Yourstring a = { "abcd" }; 
Yourstring b = a; 
Yourstring c = { 0 }; 
c = b; 

Upvotes: 5

Pankaj Kumar
Pankaj Kumar

Reputation: 82938

That's because your code snippet is not performing declaration, but assignment:

char name[10];  // Declaration 

name= "Rajesh"; // Assignment.

And arrays are not directly assignable in C.

The name name actually resolves to the address of its first element (&name[0]), which is not an lvalue, and as such cannot be the target of an assignment.

String Variable Declarations and Assignments

String variables can be declared just like other arrays:

char phrase[14];

String arrays can be initialised or partially initialised at the same time as being declared, using a list of values enclosed in "{}" braces (the same is true of arrays of other data types). For example, the statement

char phrase[14] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};

both declares the array "phrase" and initialises it to the state. The statement

char phrase[14] = "Enter age: ";

is equivalent. If the "14" is omitted, an array will be created just large enough to contain both the value ""Enter age: "" and the sentinel character "'\0'", so that the two statements

char phrase[] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
char phrase[] = "Enter age: ";

are equivalent both to each other and to the statement

char phrase[12] = "Enter age: ";

However, it is important to remember that string variables are arrays, so we cannot just make assignments and comparisons using the operators "=" and "==". We cannot, for example, simply write

phrase = "You typed: "; //Wrong way

Instead, we can use a special set of functions for string assignment and comparison.

Edited :

And other way is to do that, using pointer : -

Declare variable

char const *phrase;     /* a pointer to type character */

And initialize variable as where you want, as

phrase = "Test string"; 

Upvotes: 10

niko
niko

Reputation: 9393

I dont remember where exactly i read it but C standard says, you can assign a string value for an array at the defination but not after the defination.

char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination

rather you need to use strcpy(a,"rajesh") to assing a value for a string, if its not a defination

Upvotes: 0

xanatos
xanatos

Reputation: 111820

char name[10] ="Rajesh";

This one is an array initialization. The compiler knows of it. It's a one-shot trick. You can use it only when you define your variable. It would be equivalent to:

char name[10] = { 'R', 'a', 'j', 'e', 's', 'h', '\0' };

The other one is illegal, because you can't use array initialization outside of array definition.

Upvotes: 0

Useless
Useless

Reputation: 67713

char name[10];

In this first example, you're declaring name to be an array of ten characters. The symbol name is now interpreted as the starting address of this array, but while you can write into the array, you can't move the symbol name. So, this:

name= "Rajesh";

would mean pointing name away from the array you declared and at the location of the string literal "Rajesh" which is stored elsewhere in memory. You just can't do this.

What you can do is either:

strcpy(name, "Rajesh");

which copies your string literal from it's immutable location in your executable, into the char array you declared, or:

char const *pointer_to_name = "Rajesh";

which doesn't copy anything, but merely stores the address of your immutable string literal into a variable where you can use it, or your second example:

char name[10]="Rajesh";

which declares name to be an array of 10 characters and initialises it.

Upvotes: 3

hevi
hevi

Reputation: 2716

AS char name[10]="Rajesh" is definition compiler understands what are you trying to do and corrects your mistake. In c++ strings written in "" are constant and some compilers put them to stringpools to save space. name="...." means that you are trying to assign a constant to a non-constant pointer which is not allowed.

you should use strcpy to copy a string into an array.

Upvotes: 0

Related Questions