VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 386|回复: 7

[已解决]关于视频教程中作业的困惑

[复制链接]
41_avatar_middle
最佳答案
0 
在线会员 发表于 2022-2-20 19:39:15 | 显示全部楼层 |阅读模式
在讲到关于string.h中的一些字符操作函数的时候,老师留的作业,说模仿strcat写一个可以连接两个字符串的函数
想了很久写不出,后面讲到了指针,声明指针为 tpye * 指针名,比如 char* str1,那么直接输出 str1就是输出的str1r指向变量的内存地址,如果想输入str1指向的变量本身,那么使用* str1可以了,但是我在实际写代码中,发现这样写VS就报错.

我思考后写出的完成作业的代码:
//仿照strcat()的功能,写一个函数,来连接两个字符串

#include "stdafx.h"
#include <iostream>

using namespace std;

char * like_strcat( char * str1,  char  * str2)
{
       

       
        //此处不应该是使用*str1 *str2吗?
        cout << str1 << str2 << endl;
        return 0;
        //我这样写的实际不算是连接在一起了,不知道老师的标准答案在哪里.
       
}

int main()
{
        char * a = "this is";
        char * b = "my first c++ program!";

        cout << like_strcat(a, b)<< endl;
       
       
    return 0;
}

//还有就是如果我申明两个字符数组来接收str1,和str2就报错
比如
char stra[] = str1;这样写就是错误的
char stra[] = "this is a string";这样写就是OK的
这里让我迷糊
如果我申明两个数组来接收两个字符串,拼接
char stra[] = str1;
char strb[] = str2;
char stra[] +=char strb[];这样写也是错的
希望老师能指点一下.上面的一些疑问,和我写的这个答案是否是正确的.
最佳答案
46_avatar_small
2022-2-21 11:29:55
本帖最后由 screen_ok 于 2022-2-22 08:21 编辑
mycoder 发表于 2022-2-21 10:42
好的,我理解一下 char* str= str1 ,这句是不是可以写成*str1++=*str2++?呃,初学者看得不是很明白,能不能麻 ...


        if (NULL == str1) return NULL; // 判断指针是否为空,因为下面要对该指针进行引用(即 *str1),引用空指针会出错,你可以自己试一下。

        if (NULL != str2) // 与上面同理,防止引用空指针出错
        {
                char* str = str1 + strlen(str1); // 定义一个指针变量(名为str),指向 str1 的末尾 (str1 + strlen(str1)), 不包括末尾的0.
                while (*str++ = *str2++); // 循环赋值,把 str2 中字符放到 str1 中,同时判断 *str 的值不为0
        }

  其中的 while (*str++ = *str2++); 可以写成以下形式:

        do
        {
                *str = *str2;
                ++str2; // 指针值加一,就是指向字符串中的下一个字符
                ++str;
        } while (0 != *str);

        也等同于下面形式(这是最好理解的形式了吧?!):

  1.         int len = strlen(str1);
  2.         for (int i = 0; str2[i] != 0; ++i)
  3.         {
  4.                 str1[len + i] = str2[i];
  5.         }

  6.         str1[len + i] = 0;
复制代码




上一篇:CImage类中的StretchBlt(HDC hDestDC, const RECT&amp; rectDest...
下一篇:如何用系统托盘做一个进度条(一点击系统托盘,他就在上面显示进度条)
46_avatar_middle
最佳答案
7 
在线会员 发表于 2022-2-20 20:40:01 | 显示全部楼层
本帖最后由 screen_ok 于 2022-2-21 08:01 编辑

首先,不是老师!!!

其次,不是标准答案,仅供参考!!!

再次,被连接字符串容量要足够大,且不能是常量字符串!因为其内容要被修改!!!

#include <iostream>

using namespace std;

char* like_strcat3(char* str1, const char* str2)
{
        if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1 + strlen(str1);
                while (*str++ = *str2++);
                *str = 0;
        }

        return str1;
}
char* like_strcat2(char* str1, const char* str2)
{
        if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1 + strlen(str1);
                while (*str2) *str++ = *str2++;
                *str = 0;
        }

        return str1;
}
char* like_strcat1(char* str1, const char* str2)
{
        if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1;
                while (*str) ++str;
                while (*str2) *str++ = *str2++;
                *str = 0;
        }

        return str1;
}

void main(void)
{
        char dst[256] = "asdfasf";
        const char* src = "er2332435r";
        cout << like_strcat1(dst, src) << endl;
        cout << like_strcat2(dst, src) << endl;
        cout << like_strcat3(dst, src) << endl;
}
41_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-2-21 10:42:30 | 显示全部楼层
好的,我理解一下 char* str= str1 ,这句是不是可以写成*str1++=*str2++?呃,初学者看得不是很明白,能不能麻烦你写一下注释.NULL !=str2,是判斷字符串2不能为空,避免出现空指针?
if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1 + strlen(str1);
                while (*str++ = *str2++);
                *str = 0;
        }

     if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1 + strlen(str1);
                while (*str2) *str++ = *str2++;
                *str = 0;
        }

  if (NULL == str1) return NULL;

        if (NULL != str2)
        {
                char* str = str1;
                while (*str) ++str;
                while (*str2) *str++ = *str2++;
                *str = 0;
        }
这3个地方没有看明白 可否加一下注释,感谢.
41_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-2-21 10:44:20 | 显示全部楼层
int main()
{
        char * a = "this is";
        char * b = "my first c++ program!";

        //cout << like_strcat(a, b)<< endl;//我发上来的代码,这一行其实是不需要的.
      
      
    return 0;
}
46_avatar_middle
最佳答案
7 
在线会员 发表于 2022-2-21 11:14:08 | 显示全部楼层
本帖最后由 screen_ok 于 2022-2-22 08:10 编辑
mycoder 发表于 2022-2-21 10:42
好的,我理解一下 char* str= str1 ,这句是不是可以写成*str1++=*str2++?呃,初学者看得不是很明白,能不能麻 ...


char* str = str1 是定义一个字符型指针变量(名字是:str),同时进行赋值(str 的值等于 str1 的值)。不可以写成*str1++ = *str2++。

if (NULL != str2) 是判断 str2 不为空,其实就是 str2 不能等于 0,因为 str2 等于 0 的话,*str2 会出错!
46_avatar_middle
最佳答案
7 
在线会员 发表于 2022-2-21 11:29:55 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 screen_ok 于 2022-2-22 08:21 编辑
mycoder 发表于 2022-2-21 10:42
好的,我理解一下 char* str= str1 ,这句是不是可以写成*str1++=*str2++?呃,初学者看得不是很明白,能不能麻 ...


        if (NULL == str1) return NULL; // 判断指针是否为空,因为下面要对该指针进行引用(即 *str1),引用空指针会出错,你可以自己试一下。

        if (NULL != str2) // 与上面同理,防止引用空指针出错
        {
                char* str = str1 + strlen(str1); // 定义一个指针变量(名为str),指向 str1 的末尾 (str1 + strlen(str1)), 不包括末尾的0.
                while (*str++ = *str2++); // 循环赋值,把 str2 中字符放到 str1 中,同时判断 *str 的值不为0
        }

  其中的 while (*str++ = *str2++); 可以写成以下形式:

        do
        {
                *str = *str2;
                ++str2; // 指针值加一,就是指向字符串中的下一个字符
                ++str;
        } while (0 != *str);

        也等同于下面形式(这是最好理解的形式了吧?!):

  1.         int len = strlen(str1);
  2.         for (int i = 0; str2[i] != 0; ++i)
  3.         {
  4.                 str1[len + i] = str2[i];
  5.         }

  6.         str1[len + i] = 0;
复制代码
41_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2022-2-22 16:39:48 | 显示全部楼层
screen_ok 发表于 2022-2-21 11:29
if (NULL == str1) return NULL; // 判断指针是否为空,因为下面要对该指针进行引用(即 *str1),引用 ...

好的,我再自己理解一下.谢谢
82_avatar_middle
最佳答案
0 
在线会员 发表于 2022-2-22 18:48:10 | 显示全部楼层
学习到了,谢谢楼主
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-12-10 04:43

Powered by CcTry.CoM

© 2009-2021 cctry.com

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