去韩国学微整形怎么去:c语言 指针问题

来源:百度文库 编辑:高考问答 时间:2024/04/30 15:47:50
1.char s[5]={'A','B','C','D','E'};这个字符串赋值操作对吗?为什么?
2.char str[10],*st="abcde";strcat(str,st);和char st1="12345",*st2="abcde";strcat(st1,st2);两个程序段错误吗,为什么?
3.库函数strcpy(char *p1,char *p2)的功能和strcpy1(char *p1,char *p2)
{while ((*p1++=*p2++);)}相等吗?为什么?
这三道题都出自于c程序设计试题汇编(第二版)谭浩强。157页、159页。根据该书的参考答案:第1题(错),第2题(错),第3题(错)。

1:char s[5]={'A','B','C','D','E'};
这是个字符数组的初始化,没有问题,但它不是以字符串结束符'\0'结尾的,所以它不是字符串。如果你是想将字符串"ABCDE"赋值给字符数组s,就应该使用char s[6]="ABCDE",字符数组s的大小要定义为6,因为需要一个字符用来存储'\0',它是一个标志字符串结束的标志符。

2:char str[10],*st="abcde";strcat(str,st);
错误!因为strcat是先遍历str,直到找到'\0'为止,然后将st的内容连接上去。但str没有初始化,所以str指向未知的内存,str可能并不是以'\0'字符开头。strcat执行的结果可能会在abcde前出现乱码。修改的方法是:1)将str定义为static类型,即static char str[10];这样编译器会自动初始化str为0。2)手动初始化str,即memset( str, 0, sizeof(str) );

char *st1="12345",*st2="abcde";strcat(st1,st2);
错误! 因为系统为st1分配的有效大小为5,后面是未知的内存块。如果执行strcat,将会覆盖后面未知的内存块(里面可能保存着程序的有效数据),造成程序coredump。

3。库函数strcpy(char *p1,char *p2)的功能和strcpy1(char *p1,char *p2) {while ((*p1++=*p2++);)}相等吗?为什么?
正确!{while ((*p1++=*p2++);)}含义是1先执行*p1=*p2,然后指针p1和p2都向后移动一位。当p2移动到字符串尾时,*p2='\0',这样,*p1也等于'\0',整个表达式*p1++=*p2++的值就变为'\0'。由于字符在内存中就是以整型存储的,字符'\0'的ASCII码就是0,所有整个表达式的值就等于0。while条件不满足,跳出循环,字符串拷贝完成。如果写出让人比较明白的代码,则是
strcpy1( char *p1, char *p2 )
{
while( *p2 )
{
*p1 = *p2;
p1++; p2++;
}
*p1 = 0;
}

以下是我的理解:
1。如果说是字符串赋值是不对的,c的字符串必需以'\0'结束,s只能算一个字符数组,
如果说是字符数组赋值就对了
2。前一个是错的,str并未赋初值,未构成字符串,使用strcat会出错;后者也错,st1是字符变量,"12345"是字符指针常量,这样的赋值本身就是错的,如果定义为char st1[]="12345";就对了
3。作用相同,但库函数的实现不一定就和后者相同

TO 楼下的mseengine:
对于第三问我在TC20下做了试验,发现库函数的strcpy作用确和strcpy1的相同,就是说如果p2指向的不是字符串的话,库函数一样出错,至于死循环我发现绝大多数情况下不会发生,因为顺序的在内存读取总能读到'\0',虽然早就超出范围了

我认为楼上的回答不全对!

回答:
1:这个本身赋值操作没有问题,但如果你是想将字符串"ABCDE"赋值给字符
数组s[5],那么你就没有达到目的。因为,字符串"ABCDE"实际上一共包含
6个字符:'A' 'B' 'C' 'D' 'E' '\0' ,末尾的字符'\0'是一个标志
字符串结束的标志符,每个字符串都有。

2:两个程序段都错了。第一个程序段中char str[10]没有赋初值,所以他
并不是存储的是字符串,而函数strcat是对两个字符串的连接操作,前提
是参数必须是两个字符串,所以出错。
第二个程序段中char str1 只能存储一个字符,你现在把一个字符串赋
值给它,两者类型不匹配,报错。当然str1也没有存储一个字符串,所
以strcat出错。 赋值的时候一定要类型匹配,至少是可以相互转化
例如把char赋给int.

3:两个是肯定不一样的。库函数运行当然没问题。但函数
strcpy(char *p1,char *p2) {
while (*p1++=*p2++);
}
可能会造成死循环,因为*p1++=*p2++这个赋值操作的结果会一直未真,所以while循环会一直执行,造成死循环。

首先在概念上存在问题,这些都是初始化,不是赋值。
1. s是一个字符数组,不是字符串吧?
2. strcat(str,st);应该不对。因为str未初始化为以\0结尾。后面的那个char st1=...,st1前面应该加上*。
3. 肯定不同。自己写的函数存在几个问题,一是可能不以0结果没处理,二是p1的容量可能不够没处理,三是两个操作数可能存在相关性,比如p1=p2+1怎么办,四是返回值不同。当然对于大多数情况是可以的。