c ++ преобразует строку и int в char *, не используя стандартную библиотеку C - PullRequest
0 голосов
/ 18 марта 2011

не использует стандартную библиотеку C сделать это в C ++?

  1. Преобразовать строку в символ *
  2. Скрытие int в символ *

Если мне нужно было преобразовать строку в int в c ++, используйте что-то вроде этого

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

Ответы [ 5 ]

1 голос
/ 18 марта 2011

Конвертировать 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, которое не дает контекстной информации и, следовательно, делает его практически бесполезным, на мой взгляд.

1 голос
/ 18 марта 2011
#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 голос
/ 18 марта 2011

Полагаю, вы имеете в виду, что вам нужно решение 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;
}
1 голос
/ 18 марта 2011

Я не знаю, считаете ли вы Boost как stdlib, но lexical_cast может приводить символы * к тому, что вы захотите:

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

И наоборот:

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

Он использует струнный поток за кулисами, но намного проще в использовании.
Кроме того, вы не можете просто преобразовать int в char *, так как память, на которую указывает char *, должна быть где-то выделена.

1 голос
/ 18 марта 2011

«Преобразование string в char *» невозможно без стандартной библиотеки C ++, поскольку 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.

...