【问题标题】:How do I combine two strings?如何组合两个字符串?
【发布时间】:2014-02-05 11:29:33
【问题描述】:

本题要求在不使用<string>头文件的情况下合并两个字符串(前面较长的字符串,较长的字符串后面较短的字符串)。输入的每个字符串不能超过20个字符。 我的逻辑是:

  1. 先用strlen得到str1str2的长度,
  2. 使用str3 存储较长的字符串,使用str4 存储较短的字符串。
  3. str3str4 添加到str5

这是我的代码:

#include<iostream>
using namespace std;

int main()
{
    // combine two strings , longer in the front, and shorter 
    // after it. do not use strcat
    char str1[20],str2[20],str3[20],str4[20],str5[40];
    // str1 and str2 stores original data, str3 stores longer 
    // and str4 stores shorter, str5 stores total
    int j=0;
    cin.getline(str1,20);
    cin.getline(str2,20);
    if(strlen(str1)<=strlen(str2))
    // give longer string value to str3,shorter to str2
    {
        for (int i=0;i<20;i++)
        {
            str3[i]=str2[i];
            str4[i]=str1[i];
        }
    }
    else
    {
        for (int i=0;i<20;i++)
        {
            str3[i]=str1[i];
            str4[i]=str2[i];
        }
    }
    for(j=0;str3[j]!='\0';j++)
    {
        str5[j]=str3[j];
    }
    for(int i=j;i<40;i++)
    for(int m=0;m<20;m++)
    {
        str5[i]=str4[m];
    }
    cout<<str5<<endl;
    return 0;
}

这是输出:

我的问题是什么?两个字符串之间的那些字符是什么?谢谢!!

【问题讨论】:

  • 有什么理由不能使用std::string
  • 问题要求不要使用 std::string 标头,也许是为了练习循环?
  • 我对@9​​87654333@ 的东西不是很熟悉,但是你看过strcpy() 吗?
  • 那是 c++ 还是 c 课程?
  • 区别很复杂,但本质上c++包含了c的所有内容,并用对象扩展了它。作为学习者,您最好使用 c++ 并使用标准库,这就是人们建议您使用 std::string 而不是 char* 的原因。

标签: c++ string strlen


【解决方案1】:

特别是你明确提到自己是初学者,解决办法是使用std::string

#include <iostream>
#include <string>

int main() {
    std::string a;
    getline(std::cin, a);

    std::string b;
    getline(std::cin, b);

    // Ensure that the longer string goes to the front.
    if (a.size() < b.size());
        swap(a, b);

    std::string result = a + b;

    std::cout << result << '\n';

    // Or, simply:
    std::cout << a << b << '\n';
}

这里的信息是,尽管 C++ 有其怪癖,但如果您依赖它的库而不是从头开始实现每个低级操作,那么它是一种非常高级的语言。

【讨论】:

    【解决方案2】:

    到目前为止一切都很好(!)

    for(int i=j;i<40;i++)
    for(int m=0;m<20;m++) // This loop runs m=0 to 20 for each position of i
    {
        str5[i]=str4[m];
    }
    

    对于每个索引 i,您从 str4 复制所有 20 个元素,只留下 str4[19] 的值,可以是任何值

    只需将 i 和 m 加一即可

    int m = 0;
    for(int i=j;i<40;i++)
    {
        str5[i]=str4[m++];
    }
    

    【讨论】:

      【解决方案3】:

      您将整个 20 个字符、循环中的 40 个字符复制到变量中。找到“\0”字符时停止复制。

      但是使用 std::string 会让生活更简单:)

      【讨论】:

        【解决方案4】:

        使用std::string 很好,但这里有一些使用char* 的技巧:

        1) 你不应该复制字符串来分隔更短和更长的字符串,只需使用指针然后使用这些指针,类似以下内容:

        const char *longer_string = 0, *shorter_string = 0;
        if(strlen(str1)<=strlen(str2))
           {
             shorter_string = str1;
             longer_string = str2;
           }
         else
           {
             shorter_string = str2;
             storter_string = str1;
           }
        

        2) 使用 strcpy 和 strcat 组合字符串可以让生活变得更轻松:

            char *combined_string = new char [strlen (shorter_string) + strlen (longer_string) + 1];
            strcpy (combined_string, longer_string);
            strcat (combined_string, shorter_string);
        

        有些编译器会说这些函数不安全,你必须坚持使用_s 版本,但我想这完全取决于你。

        【讨论】:

          【解决方案5】:

          因为这显然是作业:我将指出函数 strcat 的存在,以及您可以将 char* 用于数组的事实,并且只需交换它们,而无需在初始读取和连接(这意味着您只需要两个数组:一个用于每个输入,一个用于最终值)。

          另外,在计算大小等时,不要忘记 C 风格的字符串末尾有一个额外的'\0',并留出余地。

          【讨论】:

            【解决方案6】:

            正如@David Sykes 所指出的,问题出在你的 for 循环上。因此,当您从 cin 读取输入时,您的输入字符串不必包含 20 个字符。但是在您形成循环时,您正在遍历那些超出其长度的字符串,其中可能包含垃圾字符。示例

            char str1[20]
             cin.getline(str1,20);
             cout << str1[19] << endl;
            

            假设您对上述代码的输入是“ABCD”,它仅包含 4 个字符,但您的数组的容量为 20。所以剩余空间包含垃圾字符,当您尝试打印超出实际长度的任何内容时,您将得到通配符当您输入代码时。

            【讨论】:

              猜你喜欢
              • 2020-03-13
              • 1970-01-01
              • 1970-01-01
              • 2015-05-02
              • 1970-01-01
              • 1970-01-01
              • 2022-01-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多