簡體   English   中英

C ++不使用C標准庫將字符串和整數轉換為char *

[英]c++ convert string and int to char* not using the C standard library

不使用C標准庫在C ++中執行此操作?

  1. 將字符串轉換為char *
  2. 從int轉換為char *

如果我必須在C ++中將字符串轉換為int,請使用類似以下的內容

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
    int num;
    string str="2020";
    (stringstream)"2020">>num;
    cout<<num+2;
    return 0;
}

沒有C ++標准庫,“將string轉換為char * ”是不可能的,因為string是該庫的一部分。

“將int轉換為char * ”:我假設您的意思是將int的十進制表示形式放入某些緩沖區中。 這就是如何對unsigned 對帶signed int進行相同的處理意味着您必須考慮-可能的情況,並且-INT_MIN的定義不充分會導致出現-INT_MIN情況。

unsigned n = SOME_VALUE;

char buffer[11]; // long enough for 32-bit UINT_MAX + NUL character
char *p = buffer + sizeof(buffer);

*--p = '\0';
do {
    *--p = '0' + n % 10;
    n /= 10;
} while (n);

p現在指向n的字符串表示形式。

我假設您的意思是您想要使用C ++標准庫(而不使用C標准庫)的C ++解決方案。 如果是這樣,請嘗試以下代碼:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    string stringString("2020");
    cout << "String String = " << stringString << endl;

    const char* charString = stringString.c_str();
    cout << "Char String = " << charString << endl;

    int charStringLen = stringString.size();
    for (int characterIndexCtr = 0; characterIndexCtr < charStringLen; ++characterIndexCtr)
    {
        cout << "Character At Index " << characterIndexCtr << " = " << charString[characterIndexCtr] << endl;
    }

    stringstream stringStream(stringString);
    int integerNumber;
    stringStream >> integerNumber;
    cout << "Integer = " << integerNumber << endl;
    cout << "Integer + 2 = " << integerNumber + 2 << endl;

    cout << "Press Enter To End Program ... ";
    cin.get();

    return 0;
}

我不知道您是否將Boost視為stdlib,但是lexical_cast可以將char * s轉換為您想要的任何內容:

char* foo = "123"
int bar = boost::lexical_cast(foo);

反過來:

int foo = 123;
std::string bar = boost::lexical_cast(foo);
your_function(bar.c_str());

它在后台使用stringstream,但使用起來容易得多。
同樣,您不能只將int轉換為char *,因為char *指向的內存必須分配到某個地方。

#include <sstream>
#include <iostream>
#include <string>

int main (int argc, char* argv[])
{
    std::string str ("123");
    const char* c_str = str.c_str();

    char* so_bad = const_cast<char*>(c_str);

    std::stringstream ss;
    ss << so_bad;

    int int_value;
    ss >> int_value;

    std::cout << int_value;

    return 0;
}    

string轉換為char *

std::vector<char> vec( str.begin(), str.end() );
vec.push_back( '\0' );
char * data = &vec[0];

string轉換為int

std::istringstream iss(str);
int i;
if( !iss >> i )
{
    std::ostringstream oss;
    oss << "Invalid conversion from " << str << " to integer";
    throw std::invalid_argument( oss.str() );
}

您的第二個答案接近完成該任務的方式。 請注意,有一個boost :: lexical_cast幾乎一樣,但是有一個毫無意義的bad_cast異常的巨大缺點,該異常不提供上下文信息,因此在我看來幾乎沒有用。

暫無
暫無

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

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