[英]How do I combine two strings?
這個問題要求不使用<string>
頭文件就組合兩個字符串(前面較長的字符串,后面較長的字符串較短),每個輸入的字符串不能超過20個字符。 我背后的邏輯是:
- 首先使用
strlen
獲得str1
和str2
的長度,- 使用
str3
存儲較長的字符串,並使用str4
存儲較短的字符串。- 將
str3
和str4
添加到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.