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,还是别的什么?您说上面是将“字符串”转换为 int 的示例,但实际上您正在转换 char 数组。第一个问题的答案似乎如此微不足道,以至于您的意思一定比我看到的更复杂。 我有一个函数,我必须向它传递字符串和整数数据,但它只接受 char*。我不确定我是否明白你,但让我编辑上面的代码。 【参考方案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;
    

【讨论】:

【参考方案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*的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 标准库将 HTML 字符转换回文本

使用 fmt 库将 vector<int> 转换为字符串

使用有限的类 C 库将科学计数法字符串中的数字转换为浮点数

c++ string int

将String ^转换为标准C ++字符串

标准C++四个类型转换详解