C初级常见错误
星海
posted @ 2011年2月05日 12:10
in C代码
, 1929 阅读
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]= "hello" ; 注意:不能先定义再给它赋值,如 char a[10]; a[10]= "hello" ;这样是错误的! 2、对数组中字符逐个赋值 char a[10]={ 'h' , 'e' , 'l' , 'l' , 'o' }; 3、利用 strcpy char a[10]; strcpy (a, "hello" ); 易错情况: 1、 char a[10]; a[10]= "hello" ; //一个字符怎么能容纳一个字符串?况且a[10]也是不存在的! 2、 char a[10]; a= "hello" ; //这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许! 还有:不能使用关系运算符“==”来比较两个字符串,只能用 strcmp () 函数来处理。 C语言的运算符根本无法操作字符串。在C语言中把字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行复制和比较操作。 直接尝试对字符串进行复制或比较操作会失败。例如,假定str1和str2有如下声明: char str1[10], str2[10]; 利用=运算符来把字符串复制到字符数组中是不可能的: str1 = "abc" ; /*** WRONG ***/ str2 = str1; /*** WRONG ***/ C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。但是,使用=初始化字符数组是合法的: char str1[10] = "abc" ; 这是因为在声明中,=不是赋值运算符。 试图使用关系运算符或判等运算符来比较字符串是合法的,但不会产生预期的结果: if (str1==str2) ... /*** WRONG ***/ 这条语句把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。 |
1 2 3 4 5 6 7 8 9 | 下面的代码中编译器会报一个错误,你知道是哪个语句错了吗? typedef char * pStr; char string[4] = "abc" ; const char *p1 = string; const pStr p2 = string; p1++; p2++; 是p2++出错了。这个问题再一次提醒我们: typedef 和#define不同,它不是简单的文本替换。上述代码中 const pStr p2并不等于 const char * p2。 const pStr p2和 const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此, const pStr p2的含义是:限定数据类型为 char *的变量p2为只读,因此p2++错误。 |