簡體   English   中英

如何* char + * char in c++?

[英]How to * char + * char in c++?

這是我最近遇到的一個問題。

如果我做這樣的事情:

string str1 = "some";
string str2 = "thing";
cout << str1 + str2 << endl;

我會得到下一個 output: something

但我只有這個:

char *chr1 = "How do"
char *chr2 = "I do this?"

我需要得到以下 output

那么,我該怎么做呢? 是的,我真的需要char *

您需要創建大小為strlen(chr1) + strlen(chr2) + 1 + 1緩沖區(最后一個+1因為strlen返回沒有空終止符的字符串長度,但是c字符串應以空終止符結尾),然后復制使用str(n)cpy在新緩沖區中的第一個字符串,然后使用str(n)cat

char* buffer = new char[strlen(chr1) + strlen(chr2) + 1 + 1];
strcpy(buffer, chr1);
strcat(buffer, " ");
strcat(buffer, chr2);
// use buffer
delete[] buffer;

正如ScarletAmanranth已經提到的那樣,即使strcat()可能是最好的解決方案,但還有另一種解決方案。

也可以先將c字符串轉換為std::string ,對它們執行任何所需的操作,然后將結果轉換回c字符串。 在某些情況下,這可能更適合您的需求。

例:

const char* str1 = "foo";
const char* str2 = "bar";

std::string combined = std::string(str1) + str2; // notice std::string + char* => std::string

const char* result = combined.c_str();

好處:

  • 可以寫為oneliner,而無需任何其他的緩沖區傳遞。
  • 可以通過std::string方法和相關函數更輕松地進行操作

缺點:

  • 額外的開銷
  • 僅可獲取const char* ,如果需要char*則必須再次復制c字符串

考慮返回的const char*直接指向std::string對象的內部緩沖區。 因此,只要std::string對象沒有超出范圍,指針就保持有效。 因此將其與類似const char* result = (std::string(str1) + str2).c_str();的臨時const char* result = (std::string(str1) + str2).c_str();一起使用const char* result = (std::string(str1) + str2).c_str(); 這是一個非常糟糕的主意(鑒於在函數調用中寫這樣的東西是合法的,因為在調用返回之前臨時變量一直存在)。

在這種情況下,您需要使用strcat()
如注釋中所指出的,您將需要像char[]這樣的東西作為新字符串的緩沖區。

由於這是C ++,因此必須有人提出我要提出的建議。 使用stringstream

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main() {
    char *chr1 = "How do";
    char *chr2 = "I do this?";
    stringstream ss;

    ss << chr1 << chr2;
    string result = ss.str();
    char* final = (char*) calloc(result.size()+1, sizeof(char));
    strcpy(final, result.c_str());

    cout << final << endl;

    delete [] chr1, chr2, final;

    return 0;
}

calloc(int size, sizeof([type]))調用分配了保留最終char*所需的所有內存。 這樣,您可以用更多的C ++方式將兩個字符組合在一起。 但是,您想要做的更像是C,但是由於您使用的是C ++,因此您可能會盡可能多地使用C ++中的方法。

幾個注意事項:

  • 首先, 您應該將chr1chr2聲明為const char * ,而不是char *因為嘗試修改字符串文字是未定義的行為。
  • 其次,指針上的運算operator +涉及指針算術, char *在這方面並不特殊。 如果需要連接字符串,則需要分配一個緩沖區,在緩沖區中將兩個字符串一個接一個地復制。
  • 現有答案使用普通的舊C函數(Paranaix'除外),但是如果您像std::cout這樣使用字符串流,則在C ++中會更加慣用:

     #include <string> #include <stringstream> std::ostringstream ss; ss << chr1 << " " << chr2; const std::string s = ss.str(); const char *result = s.c_str(); // you can use this pointer during the scope of `s`. 

首先不需要字符串連接; 您可以繼續使用流插入運算符<<執行有效的連接(而不是使用+組成一個臨時std::string對象,然后流插入該結果字符串):

std::string str1 = "some";
std::string str2 = "thing";
std::cout << str1 << str2 << std::endl;

而且由於這是流的屬性,而不是字符串的屬性,因此您可以使用char*輸入來完成它:

const char* chr1 = "How do "
const char* chr2 = "I do this?"
std::cout << chr1 << chr2 << std::endl;

// Output: How do I do this?

注意,我為字符串文字添加了必需的 const 只有當您的C字符串不是由字符串文字初始化時,您才可以刪除它。

通常,答案是“使用std :: string”。

是的,我確實確實需要char *。

不只是打印,我還需要獲取char *變量作為結果容器,以供將來使用。

...但是在這種情況下:

#include <cstring>

std::size_t len1 = std::strlen(str1);
std::size_t len2 = std::strlen(str2);
// unique_ptr: automated lifetime management
// 1 for '\0' terminator
std::unique_ptr<char[]> buffer( new char[len1 + len2 + 1] );
std::copy_n(str1, len1, buffer.get());
std::copy_n(str2, len2, buffer.get() + len1);
buffer.get()[len1 + len2] = '\0'; // after this, buffer.get()
                                  // points to your string

我分享我的代碼,以便能夠在另一個 auto* 中添加 'char*' 的文本,而無需通過字符串或 cstring 到 go:

#include <iostream>
using namespace std;

 int leng(char* tx){
     long long int n = 0;
     while(true){
         if(tx[n] == '\0'){
             break;
         }
         n += 1;
     }
         
     return n;
 }


int main(){
    char* t = "sffdsdssd";
    char* t2 = "axgdfb";
    long long int num = leng(t)+leng(t2);
    char g[num] = {0};
    long long int n = 0;
    for(n = 0; n < leng(t); n++){
        g[n] = t[n];
    }
    long long int num1 = leng(t);
    for(n = 0;  n < leng(t2); n++){
        g[num1+n] = t2[n];
    }
    char* resultado = (char*)g;
    cout << resultado;
    return 1;
}

暫無
暫無

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

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