鱼C论坛

 找回密码
 立即注册
查看: 1407|回复: 9

[已解决]指针,字符串函数问题

[复制链接]
发表于 2020-3-16 18:16:46 | 显示全部楼层 |阅读模式
10鱼币
题目 一:以下正确的程序段是___
A   char str1[]="12345",str2[]="abcdef";
    strcpy(str1,str2);

B  char str[10], *st="abcde";
    strcat(str,st);

C char str[10]="  ",*st="abcde";
    strcat(str,st);

D  char *st1="12345", *st2="abcde";
    strcat(st1,st2);

答案为C,想问下D为什么错,书上给字符串连接函数strcat(str1,str2)定义的时候,说了str1,str2是地址表达式,
可以为数组名或指针变量,为什么D是两个指针就不行了呢,网上搜的给的解释是指针st1指向的字符串不能变



题目二:若有语句:char s1[]="string",s2[8],*s3,*s4="string2";则对库函数strcpy的错误调用是______
A   strcpy(s1,"string2");

B strcpy(s4,"string1");

C strcpy(s3,"string1");

D strcpy(s1,s2);

答案是C,如果按照题目一解释的指针指向的字符串不能随便改变,那B选项s4是不是就错了啊


这两题很迷惑,感觉有点自我矛盾,求高人详解,重赏
最佳答案
2020-3-16 18:16:47
本帖最后由 4goodworld 于 2020-3-16 20:03 编辑

我觉得你得站在strcat和strcpy的使用要求上看,先不考虑编译成功的其他因素,
题一,D的选项,*st1的长度是5,你让它后面再加一串长度为5字符串,肯定溢出
题二,*s3,可以认为是一个没有赋值的指针,指针指向什么都不清楚,危险不危险,万一是NULL呢?如果操作它复制,要不要出事?其他几个选项,在不考虑常量不常量的情况下,都是符合两个函数执行的要求的

最佳答案

查看完整内容

我觉得你得站在strcat和strcpy的使用要求上看,先不考虑编译成功的其他因素, 题一,D的选项,*st1的长度是5,你让它后面再加一串长度为5字符串,肯定溢出 题二,*s3,可以认为是一个没有赋值的指针,指针指向什么都不清楚,危险不危险,万一是NULL呢?如果操作它复制,要不要出事?其他几个选项,在不考虑常量不常量的情况下,都是符合两个函数执行的要求的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 18:16:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 4goodworld 于 2020-3-16 20:03 编辑

我觉得你得站在strcat和strcpy的使用要求上看,先不考虑编译成功的其他因素,
题一,D的选项,*st1的长度是5,你让它后面再加一串长度为5字符串,肯定溢出
题二,*s3,可以认为是一个没有赋值的指针,指针指向什么都不清楚,危险不危险,万一是NULL呢?如果操作它复制,要不要出事?其他几个选项,在不考虑常量不常量的情况下,都是符合两个函数执行的要求的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 18:24:09 | 显示全部楼层
本帖最后由 bin554385863 于 2020-3-16 18:29 编辑


char *str = "123688";
定义字符串的时候说明这个字符串是个常量,你能对常量做改变?

至于第二题,要么你错了,要么书错了,既然你是对的,拿肯定是书错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 11:11:38 | 显示全部楼层
bin554385863 发表于 2020-3-16 18:24

char *str = "123688";
定义字符串的时候说明这个字符串是个常量,你能对常量做改变?

第二题答案就是C啊,因为s3是个野指针啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 11:13:42 | 显示全部楼层
4goodworld 发表于 2020-3-16 20:01
我觉得你得站在strcat和strcpy的使用要求上看,先不考虑编译成功的其他因素,
题一,D的选项,*st1的长度 ...

题一,D定义的是两个指针,又不是数组,怎么就肯定溢出了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 11:32:37 | 显示全部楼层
张世来4610484 发表于 2020-3-17 11:11
第二题答案就是C啊,因为s3是个野指针啊

对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 19:06:20 | 显示全部楼层
本帖最后由 4goodworld 于 2020-3-17 19:18 编辑
张世来4610484 发表于 2020-3-17 11:13
题一,D定义的是两个指针,又不是数组,怎么就肯定溢出了呢


用句流行的话:指针了不起吗?
对不起,指针不是你想为所欲为的,
举例,如果指针只是一个地址,为啥我们malloc的时候要给它长度呢?
难道就malloc出来指针有范围,其他的指针没有范围?你还搞歧视呢?哈哈
再具体说下
指针是内存地址
假设
*p1 指向的内存地址是0x00001
*p2指向的内存地址是0x00002
两者相差一个单位,
现在你准备,p1=“123456”,那么p1理论上指向的范围应该是从0x00001到0x00007
你要真这么操作了,p2就要跳起来,问你,你把我放那儿去?怎么?你还想搞歧视呢?
所以,你说指针有没有“界限”?
最后,我还想说,你得结合题目的题干来分析问题,不能想当然而把一些限制条件给抛弃了
char *st1="12345", *st2="abcde";
这两个是给定的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 20:37:39 | 显示全部楼层
4goodworld 发表于 2020-3-17 19:06
用句流行的话:指针了不起吗?
对不起,指针不是你想为所欲为的,
举例,如果指针只是一个地址,为啥 ...

我刚才试了一下题二的B答案,发现也不行,是不是这种字符串的函数第一个不能用指针,尤其是已经复制的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 21:19:58 | 显示全部楼层
在vc6上跑了一下第二题,情况如下:
题目二:若有语句:char s1[]="string",s2[8],*s3,*s4="string2";则对库函数strcpy的错误调用是______
A   strcpy(s1,"string2");//通过
B strcpy(s4,"string1");//程序崩溃
C strcpy(s3,"string1");//指示s3没定义
D strcpy(s1,s2);//显示s2没定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 21:24:24 | 显示全部楼层
张世来4610484 发表于 2020-3-17 20:37
我刚才试了一下题二的B答案,发现也不行,是不是这种字符串的函数第一个不能用指针,尤其是已经复制的指 ...

我说了:我觉得你得站在strcat和strcpy的使用要求上看,先不考虑编译成功的其他因素,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表