[英]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 中,你只能初始化数组,不能赋值,字符数组也不例外。
您将需要使用字符串复制函数,如strcpy
或strncpy
等。
但是,您可以将字符串封装在结构中并模拟:
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.