Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2015, 06:14   #1
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию Преобразование строки в число, C++

Здравствуйте.

Преобразовываю строку в число с помощью функции atoi(), но есть одна проблема:
Код:
    int number;
    number=atoi("abc");  //  number == 0
    number=atoi("-1");   //  number == -1
    number=atoi("0");    //  number == 0
Как отличить 0 от некорректно введенных данных?

Заранее благодарен.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 08.07.2015, 07:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Как отличить 0 от некорректно введенных данных?
Если хотите с атои, то проверяйте, что первый символ цифра. Ну или сколько вам там нужно.

Более правильный вариант использовать strtol / strtoul или, если доступно, strtonum.

Если же компилятор поддерживает C++11, то std::stoi, std::stol, std::stoll и ловить исключения.
p51x вне форума Ответить с цитированием
Старый 08.07.2015, 08:16   #3
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,529
По умолчанию

Воспользуйся новой, недавно изобретённой функцией.
http://programmersforum.ru/showthread.php?t=277390
Копипаст приветствуется ))
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 08.07.2015, 08:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А sscanf() тут не подойдет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.07.2015, 22:13   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Спасибо за ответы.

Лучше всего подошла функция strtol:
Код:
    long number;
    char str2[]="-7544";
    char *pEnd;
    number=strtol(str2,&pEnd,10);
    if(*pEnd){
        printf("Error");
    }
sscanf() не совсем подошел:
Код:
    long number;
    char str2[]="-512dd";
    int result = sscanf(str2,"%ld", &number);
    //  result == 1, а должен был быть 0
    //  number == -512
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 09.07.2015, 02:10   #6
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
#include <iostream>
#include <string>
#include <sstream>
#include <stdexcept>


template < typename T >
T string_cast_to ( const std::string & str )
{
	static std::stringstream ss ;
	T obj ;
	std::string test_stream_string ;
	if ( str.empty() )
		throw std::runtime_error ("conversion error") ;
	ss.clear() ;
	ss.str ( str ) ;
	if ( !(ss >> obj) )
		throw std::runtime_error ("conversion error") ;
	if ( (ss >> test_stream_string) && !test_stream_string.empty() )
		throw std::runtime_error ("conversion error") ;
	return obj ;
}


int main()
{
	std::string str ;
	std::cout << string_cast_to<int>("   12  ") << std::endl ;
	std::cout << string_cast_to<int>("   -43\n") << std::endl ;
	std::cout << string_cast_to<double>("   -.44  ") << std::endl ;
	std::cout << string_cast_to<double>("   3.658E+2  ") << std::endl ;
	std::cout << string_cast_to<double>("   10f  ") << std::endl ; //throw
	return 0 ;
}

Последний раз редактировалось Croessmah; 09.07.2015 в 02:18.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование даты в число konstantin1990 Microsoft Office Excel 5 28.12.2014 19:59
преобразование ASCII строки в число likemore Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.05.2013 17:20
Преобразование в число (Delphi) pinch000 Общие вопросы Delphi 3 25.04.2012 21:02
преобразование строки в число acronis2000 Общие вопросы C/C++ 19 04.06.2011 20:42
Преобразование строки символов в число. pa6kevi4 Общие вопросы C/C++ 2 15.09.2009 20:46