C语言字符串赋值的正确方法及常见错误解析
学了这么多年C语言,突然发现连字符串赋值都是错的。真的很难过。

字符a[10];
如何给这个数组赋值呢?
1.定义时直接使用字符串赋值
字符 a[10]="你好";
注意:不能先定义再赋值,如char a[10]; a[10]="你好";这是错误的!
2.给数组中的字符一一赋值
char a[10]={'h','e','l','l','o'};
3.使用strcpy
字符a[10]; strcpy(a, "你好");
容易出错的情况:
1. 字符a[10]; a[10]="hello";//一个字符怎么能包含一个字符串呢?而且,a[10]并不存在!
2. 字符a[10]; a="hello";//这种情况很容易出现。虽然a是一个指针,但它已经指向堆栈中分配的10个字符空间。现在在这种情况下,a 指向数据区域。 hello常量,这里的指针a是混淆的,不允许的!
C语言运算符根本不能对字符串进行操作。在C语言中,字符串被视为数组。因此,字符串受到与数组相同的限制。特别是,它们不能使用 C 语言运算符进行复制和比较。
直接尝试复制或比较字符串将会失败。例如,假设 str1 和 str2 具有以下声明:
字符str1[10],str2[10];
无法使用 = 运算符将字符串复制到字符数组中:
str1 =“abc”; /*** 错误的 ***/
字符串2 = 字符串1; /*** 错误的 ***/
C 语言将这些语句解释为一个指针和另一个指针之间的(非法)赋值操作。但是,使用 = 初始化字符数组是合法的:
char str1[10] = "abc";
这是因为在声明中,= 不是赋值运算符。
尝试使用关系或相等运算符比较字符串是合法的,但不会产生预期的结果:
if (str1==str2) ... /*** 错误 ***/
该语句将 str1 和 str2 作为指针进行比较,而不是比较两个数组的内容。由于 str1 和 str2 具有不同的地址,因此表达式 str1 == str2 的计算结果必须为 0。
原文网址: