0

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;    
}
5
  • 2
    You can't assign string literals to arrays. Commented Jul 24, 2013 at 10:57
  • 3
    I'm sure, this question should be answered in good C programming book. Commented Jul 24, 2013 at 10:59
  • array names are constant and str so, you can't modify it, compiler should give an error Commented Jul 24, 2013 at 11:00
  • @chris not only string literals here nothing can be assigned to str as its constant! Commented Jul 24, 2013 at 11:01
  • @Akshit either use this notation str[i]='a' (for arrays using [])or if you want to use name str only then declare it as a pointer char *ptr and then you can access it elements by using * operator.And "a" means its a string ...Instead use 'a'...hope this helps Commented Jul 24, 2013 at 11:36

8 Answers 8

1

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".

Sign up to request clarification or add additional context in comments.

Comments

0

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.

Comments

0

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);

Comments

0

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);

Comments

0

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';

Comments

0

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

Comments

0

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.

Comments

0

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;    
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.