использование функции atoi() в С++

когда я передаю переменную string в приведенном ниже коде, g++ выдает ошибку:

невозможно преобразовать ‘std::__cxx11::string {aka std::__cxx11::basic_string}’ в ‘const char*’ для аргумента ‘1’ в ‘int atoi(const char*)’

Мой код:

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    string a = "10";
    int b = atoi(a);
    cout<<b<<"\n";
    return 0;
}

Но если я изменю код на:

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    char a[3] = "10";
    int b = atoi(a);
    cout<<b<<"\n";
    return 0;
}

Он работает совершенно нормально.

Пожалуйста, объясните, почему string не работает. Есть ли разница между string a и char a[]?


person shubz    schedule 14.05.2016    source источник
comment
Есть ли разница между строкой a и char a[]? Да. Один std::string, а другой нет.   -  person Jonathan Wakely    schedule 14.05.2016
comment
Как ясно сказано в сообщении об ошибке, необходимо преобразование.   -  person Yves Daoust    schedule 14.05.2016


Ответы (5)


atoi — более старая функция, перенесенная из C.

В C не было std::string, вместо этого он полагался на массивы символов с нулевым завершением. std::string имеет метод c_str(), который возвращает указатель char* с завершающим нулем на строковые данные.

int b = atoi(a.c_str());

В C++11 есть альтернативная функция std::stoi(), которая принимает std::string в качестве аргумента:

#include <iostream>
#include <string>

int main()
{
    std::string a = "10";
    int b = std::stoi(a);
    std::cout << b << "\n";
    return 0;
}
person Trevor Hickey    schedule 14.05.2016
comment
Вам нужно #include <string>, чтобы использовать std::string и std::stoi(). - person Remy Lebeau; 14.05.2016
comment
[stackoverflow.com/questions/1452721/ использование пространства имен std плохо) - person Ed Heal; 14.05.2016
comment
@EdHeal Да, но это выходит за рамки вопроса ОП. Я взял то, что уже было, и применил наименьшее количество изменений, чтобы ответить на вопрос. - person Trevor Hickey; 14.05.2016
comment
@TrevorHickey: Технически вы на самом деле не ответили на заданный вопрос (почему string не работает с atoi()), вы только предоставили альтернативный код, который работает с string. - person Remy Lebeau; 14.05.2016
comment
@EdHeal: это ответ, да. Но ответ Тревора на самом деле этого не объясняет. - person Remy Lebeau; 14.05.2016

Вам нужно передать строку стиля C.

То есть использовать c_str()

Изменять

int b = atoi(a);

to

int b = atoi(a.c_str());

PS:

Так было бы лучше - заставить компилятор вычислить длину:

char a[] = "10";
person Ed Heal    schedule 14.05.2016

atoi() ожидает на входе char* с нулевым завершением. string нельзя передать как есть там, где ожидается char*, поэтому возникает ошибка компилятора. С другой стороны, char[] может превратиться в char*, поэтому использование char[] работает.

При использовании string вызывайте его метод c_str(), когда вам нужен указатель char* с завершающим нулем на его символьные данные:

int b = atoi(a.c_str());
person Remy Lebeau    schedule 14.05.2016

Между ними есть разница. Для каждого есть разные функции:

Нить

Как было сказано ранее, для string есть функция stoi:

string s("20");
cout << stoi(s) * 2; // output: 40

символ *

Раньше atoi использовалось для преобразования char*.

Однако теперь atoi заменяется на strtol, который получает 3 параметра:

  1. char* символов для синтаксического анализа до long,
  2. char**, который возвращает указатель после проанализированной строки,
  3. int для базы число должно быть проанализировано (2, 10, 16 или что-то еще).
char c[]="20";
char* end;
cout << strtol(c, &end, 16); // output: 32

Существует целая куча функций, таких как strtol, таких как strtof, strtod или strtoll, которые преобразуются в float, double, long и long long.

Основными преимуществами этих новых функций в основном являются обработка ошибок и поддержка нескольких баз.

Главный недостаток в том, что нет функции, которая конвертирует в int, только в long (кроме других типов).

Дополнительные сведения см. в разделе https://stackoverflow.com/a/22866001/12893141.

person C-H-M    schedule 16.02.2020

согласно документации atoi(), функция ожидает " указатель на интерпретируемую строку байтов с завершающим нулем", которая в основном представляет собой строку в стиле C. std::string является строковым типом в C++, но у него есть метод c_str(), который может возвращать C-строку, которую вы можете передать atoi().

string a = "10";
int b = atoi(a.c_str());

Но если вы все же хотите передать std::string и ваш компилятор поддерживает C++ 11, вы можете использовать stoi()

string a = "10";
int b = stoi(a);
person stackerjoe    schedule 14.05.2016