【问题标题】:c++ convert string and int to char* not using the C standard libraryc++ 不使用 C 标准库将字符串和 int 转换为 char*
【发布时间】:2011-03-18 13:34:46
【问题描述】:

不使用 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;
}

【问题讨论】:

  • 也许你可以澄清一下。你在这里称什么为“字符串”——basic_string,还是别的什么?您说上面是将“字符串”转换为 int 的示例,但实际上您正在转换 char 数组。第一个问题的答案似乎如此微不足道,以至于您的意思一定比我看到的更复杂。
  • 我有一个函数,我必须向它传递字符串和整数数据,但它只接受 char*。我不确定我是否明白你,但让我编辑上面的代码。

标签: c++ string integer 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 的字符串表示形式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-26
          • 1970-01-01
          • 1970-01-01
          • 2018-09-02
          • 1970-01-01
          • 2016-08-13
          • 1970-01-01
          相关资源
          最近更新 更多