Akshit
Akshit

Reputation: 103

Error in string initialisation

Here I was trying out the following thing in my code and got the following error---"prog.c:10:8: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’". Please help and tell me how can I modify my initialisation which is char str[100] to get the right answer

#include <stdio.h>
#include <stdlib.h> 

int main()
{

  char str[100];


  str = "a";
  str = str + 1;
  str = "b";
  str = str + 1;
  str = "c";
  str = str + 1;

  printf("%s", str - 2);
  return 0;    
}

Upvotes: 0

Views: 385

Answers (8)

Govind Balaji
Govind Balaji

Reputation: 639

Many, even I when learning c, was confused like you.
Actually you must be clear on this

Difference between `char []` and `char *`

=>char [] is a constant pointer which refers to the same address every time. But its value is not constant
=>char * is a non-constant pointer which can be changed to refer to any string. Its value is also not constant, but if it is assigned the address of a const char * then its value will be const.

Coming to your question

Use methods instring.h

#include<stdio.h>
#include<stdlib.h> 

int main()
{
    char string[100];
    char *str;

    *str = 'a';
    str = str + 1;
    *str = 'b';
    str = str + 1;
    *str = 'c';
    str = str + 1;

    printf("%s", str - 2);
    return 0;    
}

Upvotes: 0

user539810
user539810

Reputation:

You persist in using the wrong term, which leads me to believe that is why you couldn't find an answer.

/* 1 */
char str[100] = "a"; //OK

/* 2 */
str = "b"; // error: str is an array

Initialization is what happens when you assign a value to a variable while declaring the variable. This is source code excerpt 1 above.

Assignment is what happens after the variable is declared. You can't assign to a struct or array type. You must address each individual item in the struct/array when assigning values. In code excerpt 2 above, the variable str is assigned the value "b", except that str is an array, so the compiler says there is an error because you can't assign to an array.

Summary: You can initialize an array, but you cannot assign to it. The difference is in whether the variable was given an explicit value when it was declared. If it was, the variable was initialized. Otherwise, you're trying to assign to an array, which can't be done.

Upvotes: 0

user1814023
user1814023

Reputation:

You have declared an array

char str[100];

By specifying the name of the array you will get the base address of the array which is same as the address of first element.

str="a";

In the above statement, you are trying to assign "a"s (note "a" is string here) address to array base. The compiler will not allow you to do this. Cos, if you do so, you will lose all the 100 elements.

If you want to assign the first element with the value 'a', then do

str[0] = 'a';

Note that I have used single quote. Remember "Single quote for single char".

Upvotes: 1

Amarnath Krishnan
Amarnath Krishnan

Reputation: 1263

In general when you create an array of characters like this.

char string[100]; //allocate contigious location for 100 characters at compile time

Here string will point to the base address of the contigious location. Assuming memory address starts from 4000 then it would be like

 --------------------------------------
 |4000|4001|4002|4003|...........|4099|
 --------------------------------------

Variable string will point to 4000. To store a value at 4000 you can do *(4000).

Here you can do like

 *string='a'; //4000 holds 'a'
 *(string+1)='b'; //4001 holds 'b'
 *(string+2)='c'; //4002 holds 'c'

Note: Array can be accessed by any of the three forms in c.

string[0] => 0[string] => *(string+0) => points to first element in string array
where
     string[0] => *(4000+0(sizeof(char))) => *(4000)
     0[string] => *((0*sizeof(char))+4000) => *(4000)
     *string => *(4000)

In case of integer array, assuming int takes 4bytes of memory

int count[100]; //allocate contigious location for 100 integers at compile time

Here count will point to the base address of the contigious location. Assuming memory address starts from 4000 then it would be like

 --------------------------------------
 |4000|4004|4008|4012|...........|4396|
 --------------------------------------

variable count will point to 4000. To store a value at 4000 you can do *(4000).

Here you can do like

 *count=0; //4000 holds 0
 *(count+1)=1; //4004 holds 1
 *(count+2)=2; //4008 holds 2

So coming to your code, your objective can be achieved like this.

#include<stdio.h>
#include<stdlib.h> 
int main()
{
   char str[100];
   *str='a';
   *(str+1)='b';
   *(str+2)='c';
   printf("%s",str);
   return 0;    
}
Output: abc

Upvotes: 0

Lidong Guo
Lidong Guo

Reputation: 2857

if want initialisation a str[100],use this:

char str[100] = "abc";

it only work when we define the str[100] and initialisation str[100] at the same time!

Or you code can work in this way:

char str[100];
str[0] = 'a';     
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';

Or :

char str[100];
*str = 'a';
 ++str;
*str = 'b';
++str;
*str = 'c';
++str;
*str = '\0';

Upvotes: 0

giorashc
giorashc

Reputation: 13713

treat str as an array and not as a pointer (str points to a memory address allocated for 100 chars and str[i] accesses the relative memory address of str + i)

char str[100];

str[0]='a';
str[1]='b';
str[2]='c';
str[3]='\0';

printf("%s",str);

Upvotes: 0

uml&#228;ute
uml&#228;ute

Reputation: 31284

while arrays and pointers are closely related in C, they are not entirely the same.

char str[100];

gives you a "const pointer"-like handle to a pre-allocated array of 100 chars. this array will live at a fixed position in memory, so you cannot let str point to some other place.

 str="a";

will assign the position of a string "a" to the pointer "str". (which is illegal!).

what you can do, is to assign the values within your array.

char str[100] = {0};
str[0]='a';
str[1]='b';
str[2]='c';

printf("%s", str);

Upvotes: 0

Michel Keijzers
Michel Keijzers

Reputation: 15357

You have to use string commands like strcpy/strncpy.

Or you can allocate memory to accomodate the string and use only char pointers, no char array.

Upvotes: 0

Related Questions