c++ - 函数类似于strcat()的问题

标签 c++

我试图用c++编写类似于strcat()的函数。
这是此函数的代码:

char *mystrcat(char *str1, char *str2){
    int i = 0;
    char *buffer = str1;
    while(*str1){
        str1++; i++;
    }
    i++;
    while(*str2){
        str1[i] = *str2;
        str2++; i++;
    }
    str1[++i] = '\0';
    str1 = buffer;
    return str1;
}
此函数的输入值由以下代码给出:
char string1[100], string2[100];
    cout << "Enter string 1 ";
    cin >> string1;
    cout << "Enter string 2 ";
    cin >> string2;
    mystrcat(string1, string2);
    cout << string1 << endl;
当我运行代码并尝试输入两个字符串时,它给出了以下输出:
Enter string 1 qwerty
Enter string 2 asdf
qwerty
为什么只显示第一个字符串?

最佳答案

首先,由于您在第一个循环中同时增加了str1i,因此在该数组中的移动速度将是您认为的两倍。那是因为您同时增加了两者:

  • 数组的基础;和
  • 与该基准的偏移量。

  • 您实际上很幸运地选择了偶数个字符,否则您可能会继续超出str1的结尾(通过丢失\0),从而带来各种乐趣和欢乐:-)
    您应该增加一个或另一个,例如:
    char *mystrcat(char *str1, char *str2) {
        int i = 0;
        while(str1[i] != '\0')
            i++;
        while(*str2 != '\0')
            str1[i++] = *str2++;
        str1[i] = '\0';
        return str1;
    }
    

    之所以只在串联后得到第一个字符串,是因为第一个循环之后是i++(我已从上面的代码中删除了它)。
    当您退出该循环时,istr1终止符的索引,因此,此时的i++将跳过它。这意味着您将在该终止符之后附加str2:
    qwerty<nul>asdf<nul>
    
    因此,该字符串将仅是qwerty,因为C字符串始终在第一个终止符处停止。

    我经常发现能够从内存映射和变量寄存器(在纸上)开始,然后在脑海中运行代码,并一路更改变量是很有用的。它有助于了解您的程序如何工作。您可以从以下内容开始:
                     1         2
    Index: 012345678901234567890
    str1:  qwerty_
    str2:  asdf_
    i:     0
    
    然后,您脑海中的每一行代码都将导致i更改,或字符串存储块发生更改(末尾的_表示字符串终止符)。

    关于c++ - 函数类似于strcat()的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62827030/

    相关文章:

    c++ - 在 char 指针的末尾追加一个字符

    c++ - 如何在 vector<vector<class *>> 中存储类对象并通过引用或值访问它们并将它们传递给函数

    c++ - 用另一个字符串替换部分字符串(缺少第一个字符串)

    c++ - C2440 无法从 'void (_cdecl*)(int)' 转换为 'void(_cdecl&)(int)

    c++ - 虚函数并强制转换为 void 并返回

    c++ - 如何创建三维动态数组

    c++ - 为什么我们在C++中已经可以使用STL排序功能,还需要学习不同的排序算法?

    c++ - 为什么我不应该使用 vector<vector<vector<int>>>?

    c++ - 使用STL对两个元素进行排序

    c++ - 错误。 C++。 ')' 标记之前的预期主表达式