簡體   English   中英

如何合並兩個字符串?

[英]How do I combine two strings?

這個問題要求不使用<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

#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 ++是一種非常高級的語言,如果您依靠它的庫而不是從頭開始執行每個低級操作。

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

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

您將整個20個字符(循環中的40個字符)復制到變量中。 找到“ \\ 0”字符時停止復制。

但是使用std :: string會使生活更簡單:)

使用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版本,但是我想這完全取決於您。

既然這顯然是功課:我將指出函數strcat的存在,以及您可以在數組中使用char*並交換它們的事實,而不必在初始讀取和連接之間重新復制任何內容(這意味着您只需要兩個數組:每個輸入一個,最后一個值一個)。

而且,在計算大小等時,請不要忘記C樣式字符串的末尾有一個額外的'\\0' ,並為此留出了余地。

正如@David Sykes指出的那樣,問題出在您的for循環上。 因此,當您從cin讀取輸入時,輸入字符串不必包含20個字符。 但是在表單循環中,您將遍歷超出其長度的字符串,這些字符串可能包含垃圾字符。

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

假設上述代碼的輸入是“ ABCD”,它僅包含4個字符,但數組的容量為20。因此,剩余空間為垃圾字符,當您嘗試打印超出實際長度的任何內容時,將得到原樣的通配符輸入您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM