在这里,我在我的代码中尝试了以下内容并获得了以下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;
}
答案 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时,都像你一样感到困惑 实际上你必须清楚这个
=&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
是一个数组,因此编译器表示存在错误,因为您无法分配给数组。
要点: 您可以初始化数组,但不能分配给它。不同之处在于变量在声明时是否被赋予了显式值。如果是,则初始化变量。否则,您正在尝试分配一个无法完成的数组。