2011-03-18 41 views
0

不使用C標準庫 在C++中執行此操作嗎?C++將字符串和int轉換爲char *不使用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; 
} 
+2

也許你可以澄清一點。你在這裏叫什麼「字符串」 - basic_string ,還是別的?你說上面是一個將「string」轉換爲int的例子,但實際上你正在轉換一個char數組。第一個答案看起來如此微不足道,以至於你的意思比我所看到的更復雜。 – 2011-03-18 13:40:42

+0

我有一個函數,我必須傳遞字符串和整數數據,但它只接受char *。我不知道如果我找到你,但讓我編輯上面的代碼。 – 2011-03-18 13:48:50

回答

1
#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; 
}  
1

「轉換stringchar *「是不可能沒有C++標準庫,因爲string是該lib的一部分郭寶宏。

「將int轉換爲char *」:我假設您的意思是將int的十進制表示放在某個緩衝區中。這是如何完成的unsigned;對signed int做同樣的處理意味着您必須考慮可能的-,並且由於-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字符串表示。

1

我假設你的意思是你想要一個使用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; 
} 
+0

是的,你是對的。謝謝 – 2011-03-18 13:57:52

1

我不知道你是否算升壓爲STDLIB,但lexical_cast可以轉換到任何你想要的字符* 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 *指向的內存必須分配到某處。

+0

他們可以和我一起使用它幾分鐘,直到我看到你有一個異常時是多麼的無用,而不是提到沒有辦法讓一個語言環境變得安靜或者設置任何其他類型的格式。我相信他們已經看到了它的缺陷,並用更好的東西替代它。 – CashCow 2011-03-18 13:59:06

+0

絕對很高興知道。實際的問題不是複雜的,我改變了它。 – 2011-03-18 14:03:37

1

轉換stringchar *

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

轉換stringint

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異常的巨大缺點,它沒有提供上下文信息,因此在我看來它幾乎毫無用處。