c程序设计中的字符串

c程序设计中的字符串,c,string,pointers,initialization,C,String,Pointers,Initialization,为什么我不能编译包含代码的程序 char name[10]; name= "Rajesh"; 而我可以用 char name[10]="Rajesh"; 不能使用赋值将值赋值给字符串数组。 在C语言中,只能初始化数组而不能分配数组,字符数组也不例外 您需要使用字符串复制功能,如strcpy或strncpy等 但是,您可以将字符串封装在结构中并进行模拟: typedef struct Yourstring Yourstring; struct Yourstring { char

为什么我不能编译包含代码的程序

char name[10];
name= "Rajesh";
而我可以用

char name[10]="Rajesh";

不能使用赋值将值赋值给字符串数组。
在C语言中,只能初始化数组而不能分配数组,字符数组也不例外

您需要使用字符串复制功能,如
strcpy
strncpy

但是,您可以将字符串封装在结构中并进行模拟:

typedef struct Yourstring Yourstring; 
struct Yourstring 
{ 
    char a[24]; 
};  
Yourstring a = { "abcd" }; 
Yourstring b = a; 
Yourstring c = { 0 }; 
c = b; 
AS
char name[10]=“Rajesh”
是一个定义编译器,它了解您试图做什么,并纠正您的错误。在C++中,“在”中写入的字符串是常数,有些编译器将它们放到字符串池中以节省空间。code>name=“…”表示您试图将常量分配给不允许的非常量指针

您应该使用strcpy将字符串复制到数组中

char name[10];
在第一个示例中,您将
name
声明为十个字符的数组。符号
名称
现在被解释为此数组的起始地址,但尽管可以写入数组,但不能移动符号
名称
。 那么这个,

name= "Rajesh";
这意味着将
name
指向您声明的数组之外,并指向存储在内存中其他位置的字符串literal
“Rajesh”
的位置。你不能这么做

您可以做的是:

strcpy(name, "Rajesh");
它将字符串文本从可执行文件中的不可变位置复制到您声明的字符数组中,或者:

char const *pointer_to_name = "Rajesh";
它不复制任何内容,只将不可变字符串文本的地址存储到一个变量中,您可以在其中使用它,或者您的第二个示例:

char name[10]="Rajesh";
它将
name
声明为10个字符的数组,并对其进行初始化

这是一个数组初始化。编译器知道这一点。这是一个一次性的把戏。只有在定义变量时才能使用它。这相当于:

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

另一个是非法的,因为您不能在数组定义之外使用数组初始化

这是因为您的代码段没有执行声明,而是执行赋值:

和数组在C中不能直接赋值

名称
name
实际上解析为其第一个元素的地址(
&name[0]
),该元素不是一个,因此不能作为赋值的目标

字符串变量声明和赋值

字符串变量可以像其他数组一样声明:

字符串数组可以在声明的同时进行初始化或部分初始化,使用“{}”括号中包含的值列表(其他数据类型的数组也是如此)。例如,声明

两者都声明数组“短语”,并将其初始化为状态。声明

是等价的。如果省略“14”,则将创建一个数组,其大小刚好足以包含值“Enter age:”和前哨字符“'\0”“”,因此这两个语句

两者都是等价的,也都是等价的

但是,重要的是要记住字符串变量是数组,因此我们不能仅使用运算符“=”和“=”进行赋值和比较。例如,我们不能简单地写

相反,我们可以使用一组特殊的函数来进行字符串赋值和比较

编辑:

另一种方法是使用指针:-

声明变量

并根据需要初始化变量,如下所示:


我不记得我在哪里读过它,但C标准说,你可以在定义时为数组赋值,但不能在定义后赋值

char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination
相反,如果不是定义,则需要使用strcpy(a,“rajesh”)为字符串赋值

char name[10];
name= "Rajesh";
这里的
name
是一个字符数组。 简单的
名称
基本上是指向数组第一个元素的指针,不能像上面的语句那样为它赋值

我的观点是

字符名[10]; name=“Rajesh”

说明: 这不是正确的数组声明。字符串只是以“\0”运算符结尾的字符集合。因此,数组索引(在本例中为“name”)基本上指向数组中第一个字符的地址,即name包含“Rajesh”中字符“R”的地址

如果您想像上面提到的那样初始化,更好的方法可能是:

字符名[10]; *name=“Rajesh”

现在,上面的声明不会抛出任何错误,但仍然会抛出警告,如:

赋值从指针生成整数,无需强制转换[-Wint转换]
*Name=“RJESH”< /P>我认为你应该更好地解释他。解释他在<代码> char name(10)< /C>和 char */Co> >之间的区别。我将把它添加为注释:你的第一选择是C(第一语句)和C++(第二语句)的混合。。此链接对于进行一些比较应该很有用。请小心-以这种方式复制结构不可能用于所有C编译器实现。我认为@xanatos在这里更正确:数组初始化是允许的特殊情况。当您在VS上编译它时,您将得到“error C2440:'=”:无法从“const char[6]”转换为“char[10]“”这显然是一个常量/非常量赋值问题。我真的觉得我应该提醒你也要小心
strcpy
,但这篇文章已经足够长了。然而:小心
strcpy
。它不会检查目的地是否足够大,如果不是,你很容易引起问题。不过+1回答很好r、 我认为,如果我们在C语言中不使用“字符串”这个词来表示字符数组,那么很多coufusion都是可以避免的。C语言根本没有“字符串”数据类型,只是一个字符数组,一个带有respe的约定
char phrase[14];
char phrase[14] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
char phrase[14] = "Enter age: ";
char phrase[] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
char phrase[] = "Enter age: ";
char phrase[12] = "Enter age: ";
phrase = "You typed: "; //Wrong way
char const *phrase;     /* a pointer to type character */
phrase = "Test string"; 
char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination
char name[10];
name= "Rajesh";