Форум программистов, компьютерный форум CyberForum.ru

Аналог atoi в С++ - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.96
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
15.07.2011, 21:52     Аналог atoi в С++ #1
Вопрос возможно глупый, но если кто просветит меня буду очень благодарен))
как в С++ реализован перевод символьной строки(char или string) в int?
только начал изучать С++, знаю что в С за это отвечает atoi,
а вот в С++ ненашел(((
задача просто поставленна так, что использовать функции и библиотеки из С или STL C++ нежелательно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2011, 21:52     Аналог atoi в С++
Посмотрите здесь:

Не работает функция atoi C++
C++ Atoi, atof.
C++ atof и atoi
atoi() C++
atoi C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
15.07.2011, 22:09     Аналог atoi в С++ #2
Bars911,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <sstream>
#include <iostream>
#include <string>
 
int main()
{
   std::istringstream stream(std::string("123"));
   int number;
   
   stream >> number;
   
   std::cout << number << std::endl;
 
   return 0;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.07.2011, 22:38     Аналог atoi в С++ #3
Реализовывайте сами, это несложно.
Для беззнакового числа
C++
1
2
3
4
5
6
size_t _atoi(const char * str){
   size_t res = 0;
   for (; *str; res += *str++ - '0')
      res *= 10;
   return res;
}
P.S. посты выше и ниже моего используют STL >_<
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
15.07.2011, 22:39     Аналог atoi в С++ #4
Для std::string есть stoi :
C++
1
2
3
std::string s("37");
int i =std::stoi( s);
std::cout << i;
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
15.07.2011, 22:52     Аналог atoi в С++ #5
Цитата Сообщение от An1ka Посмотреть сообщение
Для std::string есть stoi :
В стандарте есть ?
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
15.07.2011, 22:53     Аналог atoi в С++ #6
Цитата Сообщение от An1ka Посмотреть сообщение
Для std::string есть stoi :
error: ‘stoi’ is not a member of ‘std’
да и http://www.cplusplus.com тут я ничего подобного не нашел...
вот тут есть, но это вроде как не стандарт http://en.cppreference.com/w/cpp/string/stoi
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.07.2011, 23:03     Аналог atoi в С++ #7
Цитата Сообщение от asics Посмотреть сообщение
В стандарте есть ?
Только в C++0x
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
15.07.2011, 23:05     Аналог atoi в С++ #8
Цитата Сообщение от asics Посмотреть сообщение
В стандарте есть ?
Ну если определена в заголочной библиотеке <string> , то значит есть ?!
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
15.07.2011, 23:10     Аналог atoi в С++ #9
grizlik78, У меня mingw 4.6.0, поддерживает почти все фичи из 0x, компилю:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <algorithm>
#include <string>
 
int main(){
  std::string s("37");
  int i = std::stoi( s);
  std::cout << i;
  return 0;
}
ошибка:
error: 'stoi' is not a member of 'std
'
Добавлено через 23 секунды
Цитата Сообщение от An1ka Посмотреть сообщение
то значит есть ?!
Нет...
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.07.2011, 23:14     Аналог atoi в С++ #10
asics, у меня GCC 4.5.1:
Bash
1
2
3
4
5
6
7
home ~ $ g++ stoi.cpp 
stoi.cpp: In function ‘int main()’:
stoi.cpp:7:11: error: ‘stoi’ is not a member of ‘std’
home ~ $ g++ -std=c++0x stoi.cpp
home ~ $
home ~ $ ./a.out 
37
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
15.07.2011, 23:15     Аналог atoi в С++ #11
Цитата Сообщение от asics Посмотреть сообщение
grizlik78, У меня mingw 4.6.0, поддерживает почти все фичи из 0x, компилю:
Значит не всё у вас поддерживается
У меня MS Visual C++ 2010 и всё нормально
Если интересно, то вот как она описана:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 #if _HAS_CPP0X
inline int stoi(const string& _Str, size_t *_Idx = 0,
int _Base = 10)
{   // convert string to int
const char *_Ptr = _Str.c_str();
char *_Eptr;
int _Errno = 0;
long _Ans = _CSTD _Stolx(_Ptr, &_Eptr, _Base, &_Errno);
if (_Ptr == _Eptr)
    _Xinvalid_argument("invalid stoi argument");
if (_Errno || _Ans < INT_MIN != INT_MAX < _Ans)
    _Xout_of_range("stoi argument out of range");
if (_Idx != 0)
    *_Idx = (size_t)(_Eptr - _Ptr);
return ((int)_Ans);
}
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
15.07.2011, 23:16     Аналог atoi в С++ #12
grizlik78, Компилю всегда з -std=c++0x, ошибка осталась.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.07.2011, 23:21     Аналог atoi в С++ #13
Ну, если кто знает где взять Final Draft C++0x, то можно посмотреть. В драфте от 2008 года эти функции есть, в моей реализации GCC тоже. Разве что под конец выкинули, но вряд ли.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
15.07.2011, 23:22     Аналог atoi в С++ #14
Странно, она есть в basic_string.h
C++
1
2
3
4
inline int
  stoi(const string& __str, size_t* __idx = 0, int __base = 10)
  { return __gnu_cxx::__stoa<long, int>(&std::strtol, "stoi", __str.c_str(),
                    __idx, __base); }
, но почему-то коипилятор ее не видит.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
15.07.2011, 23:31     Аналог atoi в С++ #15
В n3242.pdf от 28.02.2011 (можно найти в википедии) тоже есть, в разделе 21.5 Numeric conversions
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
15.07.2011, 23:31     Аналог atoi в С++ #16
Да да, она есть, но странно почему компилятор ее не видит.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
16.07.2011, 00:11     Аналог atoi в С++ #17
А да, в MinGW попробовал (у меня 4.5.2) тоже что-то дурит. А в линуксе вот нормально всё.

Добавлено через 35 минут
Вот она, настоящая причина:
Код
D:\Temp\test\p>gcc -x c++ -std=c++0x -E -dU stoi.cpp | find "BROKEN"
#define _GLIBCXX_HAVE_BROKEN_VSWPRINTF 1
Добавлено через 1 минуту
Bash
1
2
home /tmp $ gcc -x c++ -std=c++0x -E -dU stoi.cpp | grep BROKEN
#undef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.07.2011, 00:16     Аналог atoi в С++ #18
Пользуйте boost::lexical_cast - проще и функционалнее.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
16.07.2011, 05:14     Аналог atoi в С++ #19
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstdio>
#include <string>
 
int main(){
    std::string str("123");
    int i;
    sscanf(str.c_str(), "%d", &i);
    std::cout << i << std::endl;
    return 0;
}
гы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2011, 14:50     Аналог atoi в С++
Еще ссылки по теме:

C++ функция atoi
Результат atoi C++
C++ atoi не работает!

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bars911
0 / 0 / 0
Регистрация: 15.07.2011
Сообщений: 6
16.07.2011, 14:50  [ТС]     Аналог atoi в С++ #20
Спасибо всем отозвавшимся))))
diagon, твой вариант:

C++
1
2
3
4
5
6
1  size_t _atoi(const char * str){
2  size_t res = 0;
3   for (; *str; res += *str++ - '0')
4      res *= 10;
5   return res;
}

пожалуй для меня наиболее оптималный,
вопрос только, это хэадер cstring или cstdlib?
Yandex
Объявления
16.07.2011, 14:50     Аналог atoi в С++
Ответ Создать тему
Опции темы

Текущее время: 13:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru