字符指针和字符数组的赋值问题

  今天兴哥拿了个华为机试的小程序来问我。程序主要实现将一句话所有单词的首字母变成大写字母。代码如下:

 1 #include "stdafx.h"
2
3 void trance(char *str)
4 {
5 int flag;
6 flag=0;
7 char temp;
8 while(*str!='\0')
9 {
10 if(flag==0)
11 {
12 if(*str>'a'&&*str<'z')
13 {
14 *str=*str-32;
15 flag=1;
16 }
17 }
18 if(*str=='')
19 flag=0;
20 str++;
21 }
22 }
23
24
25 int _tmain(int argc, _TCHAR* argv[])
26 {
27 char *s="i love huawei!";
28 trance(s);
29 printf("%s\n",s);
30 return 0;
31 }

 

 

编译正确,但是运行总报错:huawei.exe 中的 0x008f1497 处有未经处理的异常: 0xC0000005: 写入位置 0x008f5740 时发生访问冲突。调试发现就是子函数中:*str=*str-32这句话出错,想了半天也没明白哪里错了。在网上寻觅半天终于发现是在主函数中初始化时char *s="i love huawei!"将字符指针s指向了一个字符串常量,所以在子函数中不可以通过*str来修改字符串常量。

(如果试图通过指针*str来修改该字符串,会出现什么结果,答案是未定义的,要视不同的编译器而定。至少有一点可以确定,在编译阶段,编译器不会报错,因 为*str不是常量,所以对*str赋值并没有什么语法错误。但是有些编译器,比如VC,会在运行时抛出异常:写入位置 0x008f5740 (str指向的地址) 时发生访问冲突!)

可以通过将字符串常量初始化成一个字符数组来解决。如:char s[]="i love huawei!";因为s[i]不是常量,所以可以通过*str来修改该字符数组,即修改了该字符串。

(哎,基本功还不行啊!)

posted @ 2011-10-15 01:58  J_Outsider  阅读(388)  评论(0编辑  收藏  举报