字符串初始化出错

时间:2013-07-24 10:55:56

标签: c arrays string pointers

在这里,我在我的代码中尝试了以下内容并获得了以下error---"prog.c:10:8: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’"。请帮助并告诉我如何修改我的初始化char str[100]以获得正确的答案

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

8 个答案:

答案 0 :(得分:1)

您已声明一个数组

char str[100];

通过指定数组的名称,您将获得与第一个元素的地址相同的数组的基址。

str="a";

在上面的语句中,您试图将“a”(注意“a”是此处的字符串)地址分配给数组库。 编译器不允许您这样做。如果你这样做,你将失去所有100个元素。

如果要为第一个元素指定值“a”,请执行

str[0] = 'a';

请注意,我使用过单引号。请记住 “单个字符的单引号”

答案 1 :(得分:0)

您必须使用strcpy / strncpy等字符串命令。

或者你可以分配内存来容纳字符串,只使用char指针,没有char数组。

答案 2 :(得分:0)

将str视为数组而不是指针(str指向分配给100个字符的内存地址,str[i]访问相对内存地址str + i

char str[100];

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

printf("%s",str);

答案 3 :(得分:0)

虽然数组和指针在C中密切相关,但它们并不完全相同。

char str[100];

为您提供一个“const指针” - 类似于预先分配的100 char个数组的句柄。此数组将位于内存中的固定位置,因此您不能让str指向其他位置。

 str="a";

将字符串"a"的位置指定给指针“str”。 (这是非法的!)。

您可以做的是分配数组中的值。

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

printf("%s", str);

答案 4 :(得分:0)

如果想要初始化str [100],请使用:

char str[100] = "abc";

它仅在我们同时定义str [100]和初始化str [100] 时才有效

或者您的代码可以这样工作:

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

或者:

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

答案 5 :(得分:0)

许多人,甚至在学习c时,都像你一样感到困惑 实际上你必须清楚这个

`char []`和`char *`

之间的区别

=&gt; char []是一个常量指针,每次都指向相同的地址。但它的价值并不恒定 =&gt; char *是一个非常量指针,可以更改为引用任何字符串。它的值也不是常数,但如果为其分配了const char *的地址,那么它的值将为const

来到你的问题

使用string.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;    
}

答案 6 :(得分:0)

通常在创建像这样的字符数组时。

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

此处字符串将指向可疑位置的基地址。假设内存地址从 4000 开始,那么它就像

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

变量字符串将指向 4000 。要将值存储在4000,您可以执行*(4000)。

在这里你可以这样做

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

注意:可以通过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)

在整数数组的情况下,假设int需要4bytes的内存

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

此处count将指向可疑位置的基地址。假设内存地址从4000开始,那就像

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

变量计数将指向 4000 。要将值存储在4000,您可以执行*(4000)。

在这里你可以这样做

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

所以来到你的代码,你的目标可以像这样实现。

#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

答案 7 :(得分:0)

你坚持使用错误的词语,这让我相信这就是你找不到答案的原因。

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

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

初始化是在声明变量时为变量赋值的情况。这是上面的源代码摘录。

赋值是声明变量后发生的事情。您不能分配给结构或数组类型。分配值时,必须处理结构/数组中的每个项目。在上面的代码摘录2中,变量str被赋值为“b”,除了str是一个数组,因此编译器表示存在错误,因为您无法分配给数组。

要点: 您可以初始化数组,但不能分配给它。不同之处在于变量在声明时是否被赋予了显式值。如果是,则初始化变量。否则,您正在尝试分配一个无法完成的数组。