繁体   English   中英

c语言中的字符串

[英]Strings in c programming

为什么我无法编译包含代码的程序

char name[10];
name= "Rajesh";

虽然我能够编译一个程序

char name[10]="Rajesh";

那是因为您的代码片段没有执行声明,而是执行

char name[10];  // Declaration 

name= "Rajesh"; // Assignment.

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

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

字符串变量声明和赋值

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

char phrase[14];

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

char phrase[14] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};

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

char phrase[14] = "Enter age: ";

是等价的。 如果省略“14”,将创建一个足够大的数组,以包含值““Enter age:”和标记字符“'\\0'”,以便两个语句

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

不能使用赋值为字符串数组赋值。
在 C 中,你只能初始化数组,不能赋值,字符数组也不例外。

您将需要使用字符串复制函数,如strcpystrncpy等。

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

typedef struct Yourstring Yourstring; 
struct Yourstring 
{ 
    char a[24]; 
};  
Yourstring a = { "abcd" }; 
Yourstring b = a; 
Yourstring c = { 0 }; 
c = b; 
char name[10];

在第一个示例中,您将name声明为一个包含 10 个字符的数组。 符号name现在被解释为这个数组的起始地址,但同时可以写入阵列,你不能移动的符号name 所以这:

name= "Rajesh";

将意味着将name远离您声明的数组并指向存储在内存中其他地方的字符串文字"Rajesh"的位置。 你不能这样做。

可以做的是:

strcpy(name, "Rajesh");

它将您的字符串文字从可执行文件中的不可变位置复制到您声明的 char 数组中,或者:

char const *pointer_to_name = "Rajesh";

它不复制任何内容,而只是将不可变字符串文字的地址存储到您可以使用它的变量中,或者您的第二个示例:

char name[10]="Rajesh";

它将name声明为一个包含 10 个字符的数组并对其进行初始化

char name[10];
name= "Rajesh";

这里name是一个字符数组。 简单name基本上是指向数组第一个元素的指针,不能像上面的语句那样赋值。

我的观点是

字符名称[10]; 名称=“拉杰什”;

说明:这不是数组的正确声明。 字符串只不过是以 '\\0' 运算符终止的字符集合。 因此,数组索引(在这种情况下是'name' ,基本上指向数组中第一个字符的地址,即 name 保存了 'Rajesh' 中字符 'R' 的地址。

在此处输入图片说明

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

字符名称[10]; *name="拉杰什";

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

赋值从指针生成整数而无需强制转换 [-Wint-conversion] *name = "Rajesh"

AS char name[10]="Rajesh"是定义编译器了解您要做什么并纠正您的错误。 在 C++ 中,用 "" 编写的字符串是常量,一些编译器将它们放入 stringpools 以节省空间。 name="...."表示您试图将一个常量分配给一个不允许的非常量指针。

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

char name[10] ="Rajesh";

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

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

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

我不记得我在哪里读过它,但 C 标准说,你可以在定义时为数组分配一个字符串值,但不能在定义之后。

char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination

相反,您需要使用 strcpy(a,"rajesh") 为字符串赋值,如果它不是定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM