Преобразование char в int в C ++

0

Я пытаюсь преобразовать символ из строки ac в int, но я все время сталкиваюсь с ошибкой.

Здесь мой код

while(std::getline(file, line)){
            if(std::isdigit(line[0]) && std::isspace(line[1]) && std::isdigit(line[2])){
                SequenceArray.push_back(line);
                if(std::stoi(line[2])== (SequenceArray.size() -1)){
                    std::cout<< "Success" << std::endl;

Ошибка, которую я получаю, выглядит следующим образом:

 a1.cpp: In function ‘int main(int, char**):
a1.cpp:30:25: error: call of overloaded ‘stoi(char&) is ambiguous
     if(std::stoi(line[2])== (SequenceArray.size() -1)){
                         ^
a1.cpp:30:25: note: candidates are:
In file included from /usr/include/c++/4.8/string:52:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a1.cpp:1:
/usr/include/c++/4.8/bits/basic_string.h:2823:3: note: int std::stoi(const string&, std::size_t*, int) <near match>
   stoi(const string& __str, size_t* __idx = 0, int __base = 10)
   ^
/usr/include/c++/4.8/bits/basic_string.h:2823:3: note:   no known conversion for argument 1 from ‘char to ‘const string& {aka const std::basic_string<char>&}
/usr/include/c++/4.8/bits/basic_string.h:2926:3: note: int std::stoi(const wstring&, std::size_t*, int) <near match>
   stoi(const wstring& __str, size_t* __idx = 0, int __base = 10)
   ^
/usr/include/c++/4.8/bits/basic_string.h:2926:3: note:   no known conversion for argument 1 from ‘char to ‘const wstring& {aka const std::basic_string<wchar_t>&}
a1.cpp:35:6: warning: label ‘std defined but not used [-Wunused-label]
      std:exit(EXIT_FAILURE);
  • 0
    Я не могу быть единственным, кто считает, что компилятор переводит line[2] кода line[2] в line.std::basic_string<_CharT, _Traits, _Alloc>::operator[]<char, std::char_traits<char>, std::allocator<char> >(2ul) сообщения line.std::basic_string<_CharT, _Traits, _Alloc>::operator[]<char, std::char_traits<char>, std::allocator<char> >(2ul) безумен.
  • 0
    @molbdnilo g ++ 4.9 значительно улучшил свои сообщения об ошибках по сравнению с g ++ 4.8
Теги:

4 ответа

1
Лучший ответ

Если std::stoi отсутствует, попробуйте #include <string> (и включите С++ 11). Однако смотрите также эту тему - порты для Windows из g++ имели давнюю проблему с поддержкой stoi и to_string.

Вторая ошибка заключается в том, что std:exit должен быть std::exit.

Третья ошибка line[2].c_str(). Вы не сказали нам, какая line, но сообщение об ошибке предполагает, что это std::string. Таким образом, line[2] является char и char, не имеет каких-либо функций-членов. Если вы объясните, что вы пытаетесь сделать в коде std::atoi(line[2].c_str()) кто-то сможет помочь. Возможно, вы имели в виду line[2] - '0' которая даст целое число от 0 до 9 если третий символ в строке был цифрой.

  • 0
    Ред. Меня больше беспокоит вторая ошибка.
  • 0
    @ Clockwork ОК, мой ответ отвечает, что
Показать ещё 5 комментариев
3

Символ неявный преобразует в int, вам не нужно использовать дополнительные функции.

'a' = 97, 'b' = 98, 'c' = 99 и т.д., следуя таблице ASCII

Поэтому, если вы пишете,

char a_char = 'a';
int a_val = a_char;
cout << a_val << endl;  

у тебя есть:

97
0

std :: stoi() - это С++ 11. Не все компиляторы по умолчанию используют С++ 11.

0

Первая ошибка связана с тем, что вы не включили поддержку С++ 11. GCC в настоящее время выбирает С++ 03 по умолчанию, а stoi не существует в этой версии.

Добавьте -std=c++11 в аргументы компилятора. Если это не сработает, попробуйте -std=c++0x и подумайте о том, чтобы получить более современный компилятор. Если вы застряли в древнем компиляторе, используйте atoi как в коде, который вы изначально разместили (или, возможно, что-то, что связано с strtol, если вы хотите обнаружить ошибки).

Также убедитесь, что вы указали <string> для объявления этой функции.

Вторая ошибка связана с тем, что вы написали : вместо ::.

  • 0
    @Clockwork: как я уже сказал, добавьте -std=c++11 к аргументам компилятора. В вашем случае добавьте его в определение CXXFLAGS в make- CXXFLAGS .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню