c++ - 反向字串 - 字元陣列倒轉




將int轉換為C++字符串的最簡單方法 (15)

int轉換為C ++中的等效string的最簡單方法是什麼? 我知道兩種方法。 有沒有更簡單的方法?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

這是另一個簡單的方法

char str[100] ; 
sprintf(str , "%d" , 101 ) ;  
string s = str; 

sprintf是眾所周知的將任何數據插入到所需格式的字符串中的一種。

您可以將char *數組轉換為字符串,如第三行所示。


C ++ 11引入了std::stoi (以及每個數字類型的變體)和std::to_string ,C atoiitoa的對應部分,但是用std::string

#include <string> 

std::string s = std::to_string(42);

因此是我能想到的最短路線。 您甚至可以使用auto關鍵字省略命名類型:

auto s = std::to_string(42);

注意:請參閱[string.conversions]n3242 21.5


sprintf()對格式轉換非常sprintf() 。 然後,您可以像在1中一樣將生成的C字符串分配給C ++字符串。


對於C ++ 98 ,有幾個選項:

boost/lexical_cast

Boost不是C ++庫的一部分,但包含許多有用的庫擴展。

lexical_cast函數模板提供了一種方便且一致的形式,用於支持在文本表示為任意類型時與其進行常用轉換。
- Boost的文檔

#include "boost/lexical_cast.hpp"
#include <string>

int main() {
    int x = 5;
    std::string x_str = boost::lexical_cast<std::string>(x);
    return 0;
}

至於運行時, lexical_cast操作在第一次轉換時需要大約80微秒(在我的機器上),然後在冗餘完成後大幅度加速。

itoa

這個函數沒有在ANSI-C中定義,也不是C ++的一部分,但是被一些編譯器支持。
- cplusplus.com

這意味著gcc / g++不能使用itoa編譯代碼。

#include <stdlib.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    x_str = itoa(x, x_str, 10); // base 10
    return 0;
}

沒有運行時間來報告。 我沒有安裝Visual Studio, reportedly能夠編譯itoa

sprintf

sprintf是C標準庫函數,可用於C字符串,並且是一個非常有效的選擇。

如果在printf上使用了格式,則會使用與要打印的文本相同的文本組成字符串,但不會打印,而是將內容作為C字符串存儲在str指向的緩衝區中。
- cplusplus.com

#include <stdio.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    int chars_written = sprintf(x_str, "%d", x);
    return 0;
}

stdio.h頭可能不是必需的。 至於運行時, sprintf操作在第一次轉換時需要大約40微秒(在我的機器上),然後如果冗餘完成,則會大大加速。

stringstream

這是C ++庫將整數轉換為字符串的主要方式,反之亦然。 stringstream有類似的姐妹函數,這進一步限制了流的預期用途,例如ostringstream 。 使用ostringstream專門告訴讀者你的代碼,你只打算使用<<操作符,本質上。 這個函數是將整數轉換為字符串所必需的。 看到這個問題進行更詳細的討論。

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

至於運行時, ostringstream操作大約需要71微秒(在我的機器上),然後如果重複執行,速度會大大提高,但不會像以前的功能那麼多

當然還有其他的選擇,你甚至可以將其中的一個包裝到你自己的功能中,但是這提供了一些流行的功能的分析。


不是我所知道的純粹的C ++。 但是對你提到的有點修改

string s = string(itoa(a));

應該可以工作,而且很短。


使用CString

int a = 10;
CString strA;
strA.Format("%d", a);

使用:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}

可能最常見的簡單方法實質上就是把你的第二選擇包裝成一個名為lexical_cast ,比如Boost的模板,所以你的代碼如下所示:

int a = 10;
string s = lexical_cast<string>(a);

其中最好的一點就是它也支持其他演員(例如,在相反的方向上也同樣適用)。

還要注意的是,儘管Boost lexical_cast剛開始寫入一個字符串流,然後從流中提取出來,現在它有一些添加。 首先,增加了很多類型的專業化,所以對於許多常見的類型,它比使用串流快得多。 其次,它現在檢查結果,所以(例如)如果你從一個字符串轉換為一個int ,它可以拋出一個異常,如果該字符串包含某些無法轉換為int (例如, 1234會成功,但123abc會拋出)。

從C ++ 11開始,有一個std::to_string函數為整數類型重載,所以您可以使用如下代碼:

int a = 20;
std::string s = to_string(a);

該標準將這些定義為等同於使用sprintf進行轉換(使用與所提供的對像類型匹配的轉換說明符,例如%d作為int ),將其轉換為足夠大小的緩衝區,然後創建一個std::string該緩衝區的內容。


如果您需要快速將具有固定位數的整數轉換為char *左填充'0',則這是一個很方便的示例:

int n = 27;
char s[8];

如果你正在轉換一個兩位數的數字:

*(int32_t*)s = 0x3030 | (n/10) | (n%10) << 8;

如果您要轉換一個三位數字:

*(int32_t*)s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

如果您正在轉換一個四位數字:

*(int64_t*)s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

等高達七位數字:)


您使用計數器類型的算法來轉換為字符串。 我從編程Commodore 64計算機中獲得了這種技術。 這對遊戲編程也很有用。

  • 你取整數,並取每個數字加權10的權重。所以假設整數是950。

    • 如果整數等於或大於100,000,則減去100,000並在[“000000”]處增加字符串中的計數器;
      繼續這樣做,直到沒有更多的數字在100,000位。 放下另一個十的力量

    • 如果整數等於或大於10,000,則減去10,000並在[“000000”] +1位置增加字符串中的計數器;
      繼續做下去,直到沒有更多的數字在10,000的位置。

  • 放下另一個十的力量

  • 重複模式

我知道950太小而不能用作例子,但我希望你能明白這一點。


我通常使用以下方法:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

here詳細描述。


添加一些允許人們以流式方式動態組合字符串的語法糖相當容易

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

現在你可以追加任何你想要的東西(假設為它定義了一個運算符<< (std::ostream& ..) )到strmake()並用它來代替std::string

例:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

首先包括:

#include <string>
#include <sstream>

其次添加方法:

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

使用這樣的方法:

NumberToString(69);

要么

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);

string number_to_string(int x){
    if(!x) return "0";
        string s,s2;
        while(x){
            s.push_back(x%10 + '0');
            x/=10;
        }
    reverse(s.begin(),s.end());
    return s;
}




type-conversion