c++ 不使用 C 标准库将字符串和 int 转换为 char*
Posted
技术标签:
【中文标题】c++ 不使用 C 标准库将字符串和 int 转换为 char*【英文标题】:c++ convert string and int to char* not using the C standard library 【发布时间】:2011-03-18 13:34:46 【问题描述】:不使用 C 标准库 在 C++ 中执行此操作?
-
将字符串转换为char*
将 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;
【问题讨论】:
也许你可以澄清一下。你在这里称什么为“字符串”——basic_string#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;
【讨论】:
【参考方案2】:我假设您的意思是您想要使用 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;
【讨论】:
【参考方案3】:我不知道你是否将 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* 指向的内存必须分配到某个地方。
【讨论】:
他们可以,我用了几分钟,直到我发现当你遇到异常时它是多么无用,更不用说没有办法灌输一个语言环境或设置任何其他一种格式。我相信他们自己已经看到了其中的缺陷,并正在用更好的东西取而代之。 很高兴知道。实际的问题并不复杂,我改变了它。【参考方案4】:将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 异常的巨大缺点,它不提供上下文信息,因此在我看来几乎没有用处。
【讨论】:
【参考方案5】:如果没有 C++ 标准库,“将string
转换为char *
”是不可能的,因为string
是该库的一部分。
“将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
的字符串表示形式。
【讨论】:
以上是关于c++ 不使用 C 标准库将字符串和 int 转换为 char*的主要内容,如果未能解决你的问题,请参考以下文章