如何组合两个字符串?

时间:2014-02-05 11:29:33

标签: c++ string strlen

这个问题需要组合两个字符串(前面的字符串越长,后面的字符串越短)不使用<string>头文件。输入的每个字符串不能超过20个字符。 我背后的逻辑是:

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

这是我的代码:

#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;
}

这是输出:

enter image description here

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

6 个答案:

答案 0 :(得分:5)

特别是因为您明确提到作为初学者,解决方案是使用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 ++尽管有其怪癖,但如果你依赖它的库而不是从头开始实现每个低级操作,那么它是一种非常高级的语言。

答案 1 :(得分:3)

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

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];
}

对于每个索引,你要复制str4中的所有20个元素,只留下str4 [19]中的值,这可能是任何东西

只需将i和m一起递增

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

答案 2 :(得分:2)

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

但是使用std :: string可以简化生活:)

答案 3 :(得分:1)

使用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版本,但我想这完全取决于你。

答案 4 :(得分:1)

因为这显然是家庭作业:我只是指出函数strcat的存在,以及你可以使用char*到数组的事实,只需交换它们,而不必重新复制初始读取和连接之间的任何内容(这意味着您只需要两个数组:每个输入一个,最后一个数据一个)。

而且,在计算尺寸等时,不要忘记C风格的字符串最后有一个额外的'\0',并允许它。

答案 5 :(得分:1)

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

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

假设您输入的上述代码是“ABCD”,其中只包含4个字符,但您的数组容量为20.因此剩下的空间有垃圾字符,当您尝试打印超出实际长度的任何东西时,您将获得狂野的角色当你进入你的代码时。