这段代码编译没错,但是为什么运行起来却无法实现呢?

这段代码编译没错,但是为什么运行起来却无法实现呢?

#include<iostream>

#include<string>

#include<assert.h>

using namespace std;

int str_len(const char *str);

char *str_con(char *des,const char *in);

char *str_copy(char *des,const char *in);


int main()

{

    //定义两个字符串

    //比较两个字符串的长度,根据结果连接字符串,并输出连接后的字符串

    char *p="I am a chinese";

    char *q="I love China";

char gg[30];

if(str_len(p)>str_len(q))

{ cout<<str_con(gg,p)<<endl;//其实我觉得这里用str_con和str_copy是一样的,用str_copy也会出现一样的错误

   cout<<str_con(gg,q)<<endl;

}

else

{ cout<<str_con(gg,q)<<endl;

cout<<str_con(gg,p)<<endl;

}

return 0;

    

}



int str_len(const char *str)

{

assert(str!=NULL);

int len=0;

while(*str++!='\0')len++;

return len;

}


char *str_con(char *des,const char *in)

{

assert((des!=NULL)&&(in!=NULL));

char *address=des;

while(*des!='\0')des++;

while((*des++=*in++)!='\0');

return address;

}


char *str_copy(char *des,const char *in)

{

assert((des=!NULL)&&(in!=NULL));

char *address=des;

while((*des++=*in++)!='\0');

return address;

}


正在回答

登陆购买课程后可参与讨论,去登陆

4回答

您好,首先拷贝字符串逻辑:

    目标数组=原字符串首地址,循环指针增加,将内容拷贝到目标数组中。当原字符串为'\0'时结束循环。

拼接字符串逻辑:

    循环遍历目标数组的指针,将指针移动到目标数组的最后一位,再将内容和拷贝相同的方式拼接到原数组之后。

    虽然代码上只相差了一行,但对于拼接函数判断指针移动到目标数组的最后一位while(*des!='\0')des++;这段代码不可缺少。

    拼接字符串不能代替拷贝字符串则是因为这句判断,在拼接字符串时,代码中将目标地址定义为char gg[30];,但是拼接字符串中while(*des!='\0')des++;这段代码判断的是以'\0'结尾,程序对于空数组没有找到,所以你将str_copy换成str_con时会出现乱码并且程序终止,可在定义char gg[30];时改为char gg[30] = {'\0'};。则可以使用str_con方法了。

如果解决了您的问题,请采纳,祝学习愉快!

  • 请叫我deeply 提问者 #1
    谢谢助教老师!那么说空字符是没有/0的吗
    2018-03-21 14:54:19
  • 好帮手慕查理 回复 提问者 请叫我deeply #2
    您好,char gg[30];只是去声明了一个空的数组,此时是没有任何内容的。
    2018-03-21 15:56:15
  • 请叫我deeply 提问者 回复 好帮手慕查理 #3
    哈哈原来是这样,我还以为里面有个/0,这个问题困扰了我很久也影响了我后面的学习进度,谢谢助教老师!
    2018-03-21 15:59:03
Tender10 2018-03-19 18:13:33

str_copy()方法中,你的判断语句写错了,应该是

assert((des!=NULL)&&(in!=NULL));

你写成了

assert((des=!NULL)&&(in!=NULL));

修改一下即可编译成功

  • 提问者 请叫我deeply #1
    谢啦,那个地方是写错了,但是为什么用连接程序不能代替copy程序呢
    2018-03-21 12:42:33
guly 2018-03-19 10:35:45

你好,拷贝和连接是不同的,具体实例参考如下:

char *strcpy(char* dest, const char *src); // 把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间,返回指向dest的指针。

char *strcat(char *dest,char *src); // 把src所指字符串添加到dest结尾处,返回指向dest的指针。

如果解决您的问题请采纳,祝学习愉快!

  • 提问者 请叫我deeply #1
    是啊,但是当dest为空字符时这两者不是同一个意义吗
    2018-03-19 15:02:27
  • guly 回复 提问者 请叫我deeply #2
    得到的结果可能相同,但是拷贝和连接意义是不一样的
    2018-03-19 17:24:23
  • 提问者 请叫我deeply 回复 guly #3
    不是的,它们的意义虽然不同,但是根本得不到结果,运行起来会出错
    2018-03-19 17:28:28
提问者 请叫我deeply 2018-03-16 23:51:34

我尝试了一下str-copy不能被str-cat取代,但是逻辑上它们是可行的啊,那为什么实际上不行呢?

  • 提问者 请叫我deeply #1
    拷贝不就是相当于连接一个空字符串吗
    2018-03-16 23:54:46
  • Tender10 回复 提问者 请叫我deeply #2
    拷贝是相当于复制了一份哦。
    2018-03-18 19:17:01
  • 提问者 请叫我deeply 回复 Tender10 #3
    但是它们的代码差别只是一个判断该字符串是否为零的判断句而已,从逻辑上分析那个判断句是不影响的
    2018-03-18 19:21:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
C++零基础入门 热门编程语言 二级考试必备
  • 参与学习       529    人
  • 提交作业       110    份
  • 解答问题       594    个

无论您是零基础、还是想晋升,亦或是想转型,C++无疑都是最佳选择。本路径共分为基础语法、指针与引用、面向对象三大模块,为你开启入门C++编程的大门!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师