Определить, является ли строка числом
Я создал код, который проверяет,является ли строка числом. Но не могу сообразить, как написать,чтобы число еще было больше нуля (не равнялась нулю).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#include #include #include using namespace std; bool is_digit(const char *S){ const char *temp = "0123456789"; for (int i=0; istrlen(S); i++) { if (!strchr(temp,S[i])) return false; } return true; } int main() { const int N = 256; char S[N]; int value = 0; cin.getline(S,N); while(!is_digit(S)){ cerr <"Error. Enter an integer\n"; cin.getline(S,N); } value = atof(S); cout <"value = " ; }
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Определить, является ли вводимая строка целым числом
Определить, является ли вводимая строка целым числом, т.е. содержит только цифры и, возможно, знак.
Определить, является ли введенная с клавиатуры строка вещественным числом
Написать программу, которая проверяет, является ли введенная с клавиатуры строка вещественным.
Определить, является ли введённая с клавиатуры строка двоичным числом
Задание: Напишите программу, которая определяет, является ли введённая с клавиатуры строка.
Проверка является ли строка числом полностью числом или нет?
как проверить является ли строка типа "23уар" полностью числом или нет?
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
Сообщение от caesarh2o
Я создал код, который проверяет,является ли строка числом. Но не могу сообразить, как написать,чтобы число еще было больше нуля (не равнялась нулю).
Хреново вызывать strlen(S) в условии цикла
1 2 3 4 5 6
for (int i=0, n = strlen(S); in; i++) if (S[i] '0' return true; }
Является ли строка числом в вводе в C#
Мне нужно написать проверку на C#. Проверка заключается в следующем, как проверить ввод пользователя и понять это строка является числом или строкой. Например мне надо, чтобы пользователь заполнил массив и если он вводит не целое число, то программа будет выдавать «Введите число». Есть идеи, как это можно реализовать?
Отслеживать
задан 25 авг 2020 в 17:18
359 2 2 золотых знака 4 4 серебряных знака 14 14 бронзовых знаков
25 авг 2020 в 17:22
Большое вам спасибо. Ибо я только начинаю изучать C# любой совет мне очень полезен.
25 авг 2020 в 17:24
ru.stackoverflow.com/questions/1144663/… – мой ответ на подобный вопрос (не дубликат)
25 авг 2020 в 17:25
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Просто дополню комментарии примером
while (true) < Console.Write("Введите число: "); string text = Console.ReadLine(); if (int.TryParse(text, out int number)) < Console.WriteLine("Вы ввели число ", number); break; > Console.WriteLine("Не удалось распознать число, попробуйте еще раз."); >
Отслеживать
ответ дан 25 авг 2020 в 17:40
50k 6 6 золотых знаков 25 25 серебряных знаков 60 60 бронзовых знаков
Спасибо вам огромное
25 авг 2020 в 19:56
Есть метод для char — IsDigit
bool StringIsDigits(string s) < foreach(var item in s) < if(!char.IsDigit(item)) return false; //если хоть один символ не число, то выкидываешь "ложь" >return true; //если ни разу не выбило в цикле, значит, все символы - это цифры >
Отслеживать
ответ дан 26 авг 2020 в 4:46
Johannes Krauser III Johannes Krauser III
109 5 5 бронзовых знаков
- c#
- строки
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8412
Как проверить, является ли строка числом в C#
Проверка, является ли строка числом или нет в C# #
Например, у нас есть строковая переменная “123”, и если вы хотите проверить, является ли она числовой, используйте приведенный ниже код на C#.
Начиная с C# 7 мы можем объявить переменную out в самом методе TryParse.
Проблема с приведенным выше методом int.TryParse заключается в том, что он не может проверить отрицательные значения строковых чисел.
Проверка отрицательного числа строк в C# #
Для проверки отрицательных значений числа строк мы можем использовать метод C# double.TryParse() .
0) else
Для проверки того, является ли строка числом, всегда используйте метод double.TryParse() , поскольку он может проверять как положительные, так и отрицательные числа.
Don’t be a Stranger. Connect me at Social Networking Sites.
Stay in the loop
Get a short & sweet tutorials delivered to your inbox every couple of days. No spam ever. Unsubscribe any time.
Как определить, является ли строка числом с C ++?
У меня было довольно много проблем с попыткой написать функцию, которая проверяет, является ли строка числом. Для игры, которую я пишу, мне просто нужно проверить, является ли строка из файла, который я читаю, числом или нет (я буду знать, является ли это параметром таким образом). Я написал функцию ниже, которая, как я считаю, работает плавно (или я случайно отредактировал ее, чтобы остановить ее, или я шизофреник или Windows шизофреник):
bool isParam (string line)
Brendan Weinstein 11 янв. 2011, в 07:32
Поделиться
Я ненавижу видеть, if (expr) return true; return false; ! Просто напишите return expr; ,
ephemient 11 янв. 2011, в 06:08
@ephemient Мой стиль — делать то же самое, что и ты. Но действительно ли это важно?
Brennan Vincent 11 янв. 2011, в 06:12
Ваш прототип функции не подходит. Почему бы не использовать bool isParam (const string & line)
MikimotoH 11 янв. 2011, в 06:34
Да уж. У меня плохая привычка кодировать длинные стили при изучении нового языка. Я новичок в C ++ и больше колеблюсь с «ярлыками» (или воспринимаемыми ярлыками).
Brendan Weinstein 11 янв. 2011, в 06:59
@Brennan Бреннан Винсент: Да, это большое дело. Это тот же класс ошибок, как if (expr) return expr; else return expr; , if (expr == true) , (if expr != false) или if ((expr == true) == true) . Все они представляют сложность, которая не приносит пользы писателю, читателю или компилятору кода. Устранение ненужной сложности — это не быстрый путь; это ключ к написанию лучшего программного обеспечения.
MSalters 11 янв. 2011, в 08:24
@MSalters Лично я не думаю, что версия OP обязательно настолько плоха. Я использую эту конструкцию, когда подозреваю, что может быть больше кода между оператором if и оператором return. Только когда я точно знаю, что больше ничего не будет, я сверну его, чтобы вернуть expr.
TStancek 18 март 2019, в 11:29
Показать ещё 4 комментария
Поделиться:
29 ответов
Лучший ответ
Самый эффективный способ — просто перебрать строку, пока не найдете символ без цифр. Если есть несимметричные символы, вы можете считать строку не числом.
bool is_number(const std::string& s)
Или если вы хотите сделать это способом С++ 11:
bool is_number(const std::string& s) < return !s.empty() && std::find_if(s.begin(), s.end(), [](char c) < return !std::isdigit(c); >) == s.end(); >
Как указано в комментариях ниже, это работает только для целых положительных чисел. Если вам нужно обнаружить отрицательные целые числа или фракции, вы должны пойти с более надежным решением на базе библиотеки. Хотя добавление поддержки отрицательных целых чисел довольно тривиально.
Charles Salvia 11 янв. 2011, в 07:40
Поделиться
Также не обрабатывает отрицательные числа и не целые числа. Мы не можем знать, какие требования основаны на вопросе.
Brennan Vincent 11 янв. 2011, в 06:24
Да уж. Извините, я должен был быть более конкретным. Я знаю, что цифры, которые я ищу, положительные. Это решение работает очень хорошо.
Brendan Weinstein 11 янв. 2011, в 06:36
Вы также можете использовать !s.empty() && s.find_first_not_of(«0123456789») == std::string::npos; для одной строки C ++ 03.
kbjorklu 11 янв. 2011, в 07:03
Также не обрабатывает десятичные числа, например: 1.23
littlecodefarmer758 10 март 2013, в 09:31
Для обработки целых чисел со std::string::const_iterator it = s.begin(); после std::string::const_iterator it = s.begin(); строку, которую вы можете добавить, if(s[0] == ‘-‘ || s[0] == ‘+’) it++; . Просто быть уверенным, что не пустой вход поступает.
Fredrick Gauss 17 март 2013, в 22:40
Не обрабатывает десятичные числа и номера научных обозначений!
Daniel 11 апр. 2013, в 20:12
И не обрабатывает большие числа, которые не вписываются в int .
Remy Lebeau 15 май 2013, в 22:42
@Remy Реми Лебо, да, это так. На самом деле это не преобразование строки в int . Он просто определяет, состоит ли строка из цифровых цифр. Неважно, какова длина строки.
Charles Salvia 16 май 2013, в 18:21
@CharlesSalvia: Я пытался подчеркнуть, что если строка длиннее 9 цифр, она, скорее всего, не преобразуется в int если код должен выполнить это преобразование после проверки строки. Таким образом, длина строки должна быть проверена, чтобы убедиться, что фактическое содержимое строки подходит для любой цели, для которой будет использоваться строка. Недостаточно просто проверять нецифровые символы, если длина строки также не подходит.
Remy Lebeau 16 май 2013, в 19:08
Это решение кажется мне безобразным и негибким. Использование регулярных выражений является наиболее простым решением для анализа. Это решение не является расширяемым (попробуйте написать соответствующее число с плавающей запятой в том же стиле), не проверяет знак, имеет логические недостатки, которые были обнаружены выше, гораздо сложнее, чем регулярное выражение.
Dmytro Sirenko 31 июль 2013, в 17:45
@FredrickGauss Есть проблема с этим подходом: даже «-» или «+» тогда считается числом. В конце требуется дополнительная проверка вместо! String.empty (), то есть static bool isIntegerNumber(const std::string& string)< std::string::const_iterator it = string.begin(); int minSize = 0; if(string.size()>0 && (string[0] == ‘-‘ || string[0] == ‘+’)) < it++; minSize++; >while (it != string.end() && std::isdigit(*it)) ++it; return string.size()>minSize && it == string.end(); >
Constantin 05 нояб. 2013, в 21:49
Спасибо, что заметили @Constantin. Изменить для моего предложения: для обработки целых чисел со std::string::const_iterator it = s.begin(); , после std::string::const_iterator it = s.begin(); Вы можете добавить строку, if(s.size() > 1 && (s[0] == ‘-‘ || s[0] == ‘+’)) it++;
Fredrick Gauss 10 нояб. 2013, в 07:52
Не забудьте включить
kR105 04 нояб. 2014, в 18:40
@kR105 kR105 ты герой! Мне бы очень хотелось, чтобы люди привыкли упоминать, какие библиотеки они используют в своих ответах
Scy 26 март 2016, в 18:01
Хороший ответ должен работать для всех чисел, таких как 3.2+e15, 3.2-e27, 3.2+E45, 44.9L и т. Д.
MVTC 30 янв. 2017, в 03:40
Показать ещё 13 комментариев
Зачем изобретать колесо? Стандартная библиотека C (также доступна на С++) имеет функцию, которая выполняет именно это:
char* p; long converted = strtol(s, &p, 10); if (*p) < // conversion failed because the input wasn't a number >else < // use converted >
Если вы хотите обрабатывать фракции или научную нотацию, используйте вместо этого strtod (вы получите результат double ).
Если вы хотите разрешить шестнадцатеричные и восьмеричные константы в стиле C/С++ ( «0xABC» ), тогда вместо этого сделайте последний параметр 0 .
Затем ваша функция может быть записана как
bool isParam(string line)
Ben Voigt 15 май 2013, в 22:55
Поделиться
Эта функция отбрасывает пустое пространство впереди. Таким образом, вы должны проверить первый символ на isdigit.
chmike 24 июнь 2013, в 08:51
@chmike: Исходя из моего понимания вопроса, отбрасывание начальных пробелов — это правильное поведение ( atoi как используется в этом вопросе, делает это также).
Ben Voigt 24 июнь 2013, в 12:21
Вопрос не был указан явно, но мое понимание требования «проверяет, является ли строка числом», означает, что вся строка является числом, то есть без пробелов. Я чувствовал необходимость указать, что ваш ответ отличается от других в этом отношении. Ваш ответ может быть хорошим, если в строке есть пробелы перед числом.
chmike 01 июль 2013, в 10:53
@BenVoigt Вы говорите , что p будет установлен nullptr если strtol является успешен, верно? Это не то, что я вижу 🙁
Jonathan Mee 13 нояб. 2014, в 21:21
@JonathanMee: Нет, p будет указывать на NUL, который завершает строку. Так что p != 0 и *p == 0 .
Ben Voigt 13 нояб. 2014, в 21:23
Приведенный выше код не обрабатывает десятичные разряды, и strtod считает, что «NaN» — это число.
Steve Smith 07 авг. 2018, в 13:18
@Steve: strtol не обрабатывает десятичные strtol , потому что он предназначен для этого. long является целочисленным типом. strtod не думает, что «NaN» — это число, он думает, что это действительный double . и это правильно. Если вы хотите проверить, что что-то является конечным двойным isfinite тривиально объединить strtod с isfinite . Для каждой возможности не требуется отдельной функции «конечный двойной», «строго положительный двойной», «неотрицательный двойной» и т. Д.
Ben Voigt 08 авг. 2018, в 04:00
Показать ещё 5 комментариев
Вы можете сделать это с помощью С++ с boost:: lexical_cast. Если вы действительно настаиваете на том, чтобы не использовать boost, вы можете просто изучить, что он делает, и сделать это. Это довольно просто.
try < double x = boost::lexical_cast(str); // double could be anything with >> operator. > catch(. )
Crazy Eddie 11 янв. 2011, в 07:54
Поделиться
Использование try<> catch<> хорошая идея? Разве мы не должны избегать этого в максимально возможной степени?
Nawaz 11 янв. 2011, в 06:17
@Nawaz: Нет. Есть причина, по которой он является частью языка C ++. Как и все конструкции C ++, его следует использовать в соответствующих местах. Учитывая, что операция чтения файла в любом случае связана с вводом / выводом, это не кажется чрезмерным.
MSalters 11 янв. 2011, в 08:27
Наваз — здесь нет способа избежать этого. Если вы хотите избежать этого, вам нужно переписать lexical_cast. На самом деле, lexical_cast ведет себя правильно. Если значение в строке не является числом, то оно не может выполнять свою работу. Это исключительная ситуация для этой функции.
Crazy Eddie 11 янв. 2011, в 17:19
-1 за злоупотребление попробуйте поймать . blogs.msdn.com/b/ericlippert/archive/2008/09/10/…
NoSenseEtAl 28 нояб. 2012, в 09:59
try <> catch <> здесь уместно. Тем не менее, поймать (. ) просто плохая практика. В этом случае используйте boost :: bad_lexical_cast для вашего обработчика исключений.
NuSkooler 07 фев. 2013, в 17:59
Я чувствую, что это пытается читать из файла. Неважно, сколько вы проверяете файл, вы не узнаете, можно ли прочитать его, пока вы не сделаете это. Это или будет работать или нет. В этом случае вам нужно поймать исключение. Так что в этом случае я думаю, что это совершенно хороший способ сделать это.
Casey 10 май 2013, в 00:06
Это злоупотребление исключениями, в Windows это может вызывать зависящие от ОС действия, что недопустимо для простой задачи декодирования чисел.
Dmytro Sirenko 31 июль 2013, в 17:48
@EarlGray — мне, конечно, было бы интересно узнать, какие действия Windows-зависимые действия предпримут. Стандарт довольно ясно показывает, как должен вести себя этот код.
Crazy Eddie 02 авг. 2013, в 00:46
c2.com/cgi/wiki?DontUseExceptionsForFlowControl — URL говорит, что все это действительно
danio 26 нояб. 2015, в 12:32
@NoSenseEtAl NoSenseEtAl Ваша собственная ссылка говорит, что попытка catch должна быть использована в этом случае. «Исключительные исключения возникают в совершенно неисключительных обстоятельствах, и поэтому должны быть пойманы и обрабатываться постоянно».
Ville-Valtteri 09 март 2017, в 06:36
@Ville-ValtteriTiittanen: Ville-ValtteriTiittanen: это определение досадного исключения, а не руководство по их использованию. (Обратите внимание на цитату «надо», вы перефразировали неправильно как «следует»)
Ben Voigt 16 май 2017, в 14:16
@BenVoigt Как вы понимаете эту часть о преобразовании строк в числа? «Классическим примером досадного исключения является Int32.Parse, которое выдает, если вы даете ему строку, которую невозможно проанализировать как целое число. Но в 99% случаев для этого метода используется преобразование строк, введенных пользователем, которые могут быть любыми старая вещь, и, следовательно, синтаксический анализ ни в коем случае не является исключительным. — Вы должны ловить неприятные исключения «
Ville-Valtteri 17 май 2017, в 06:20
@Ville-ValtteriTiittanen: Ville-ValtteriTiittanen: Продолжайте читать, обратите внимание на то, где написано: «Старайтесь никогда не писать библиотеку самостоятельно, которая вызывает неприятное исключение». и «Избегайте неприятных исключений, когда это возможно, вызывая« пробные »версии тех неприятных методов, которые выдают в неисключительных обстоятельствах. Если вы не можете избежать вызова неприятного метода, поймайте его раздражающие исключения». Ну, вы можете избежать вызова функции, которая вызывает неприятное исключение. boost::lexical_cast — версия с неприятными исключениями (плохо!), strtod — версия, которая сообщает об ожидаемых сбоях без использования исключений (хорошо!)
Ben Voigt 17 май 2017, в 07:41
Показать ещё 11 комментариев
С компилятором С++ 11 для неотрицательных целых чисел я бы использовал что-то вроде этого (обратите внимание на :: вместо std:: ):
bool is_number(const std::string &s)
szx 31 июль 2013, в 17:20
Поделиться
Это лучший ответ.
Martin Broadhurst 17 янв. 2017, в 13:48
Если в строке есть символы utf8, вы получите ошибку во время выполнения.
Lion King 23 фев. 2018, в 12:58
Я просто хотел использовать эту идею, которая использует итерацию, но какой-то другой код выполняет эту итерацию:
#include bool is_number(const std::string& s)
Он не устойчив, как это должно быть при проверке знака десятичной точки или минуса, поскольку он позволяет иметь более одного из каждого и в любом месте. Хорошо, что это единственная строка кода и не требует сторонней библиотеки.
Выньте ‘.’ и ‘-‘, если допустимы целые положительные числа.
David Rector 09 май 2013, в 16:41
Поделиться
ошибка: ‘strspn’ не был объявлен в этой области, я думаю, это потому, что мне не хватает «#include», но что
Qwertie 22 янв. 2014, в 01:42
David Rector 23 янв. 2014, в 17:21
Если вы собираетесь использовать std::string , используйте find_first_not_of член find_first_not_of .
Ben Voigt 02 апр. 2014, в 16:36
Это не получится, если вы передадите строку «12.3-4.55-», которая, очевидно, не является допустимым числом
Buzzrick 15 авг. 2014, в 00:22
Баззрик, предлагаемый ответ уже заявляет, что это не получится с тем номером, который вы упомянули.
David Rector 09 нояб. 2017, в 00:34
если вы ограничите его только «0123456789», тогда формула идеально подходит для проверки на целое число без знака
no one special 13 фев. 2019, в 10:44
Показать ещё 4 комментария
Я бы предложил подход с регулярным выражением. Полное регулярное выражение (например, используя boost:: regex) с помощью
-?[0-9]+([.][0-9]+)?
будет показывать, является ли строка числом или нет. Это включает в себя положительные и отрицательные числа, как целое, так и десятичное.
[0-9]+([.][0-9]+)?
(только целое число)
(только положительное целое число)
Mephane 11 янв. 2011, в 10:05
Поделиться
Гм, я пытался использовать std::regex с gcc 4.7, gcc 4.8 — они оба бросают std::regex_error на любой знак [ в регулярном выражении, даже для невинного «[abc]» (я делаю это неправильно?). clang-3.4 вообще не знает о
Dmytro Sirenko 31 июль 2013, в 17:41
@EarlGray: регулярное выражение доступно только из GCC 4.9
Lightness Races in Orbit 01 фев. 2014, в 21:28
С помощью этого решения вы можете проверить все: от отрицательных до положительных чисел и даже числа с плавающей запятой. Когда вы меняете тип num на integer, вы получите сообщение об ошибке, если строка содержит точку.
#include #include using namespace std; int main() < string s; cin >> s; stringstream ss; ss > num; if(ss.good()) < cerr else if(num == 0 && s[0] != '0') < cerr else < cout >
tom1991te 15 май 2013, в 22:32
Поделиться
Здесь другой способ сделать это с помощью библиотеки :
bool is_integer(const std::string & s)
mpataki14 01 фев. 2014, в 20:43
Поделиться
Ах, так и будет. Я обновил с лучшим решением. Благодарю.
mpataki14 20 март 2014, в 04:00
Если это не «[(- | +) |] [0-9] +» (плюс вместо звезды), иначе ваше регулярное выражение может совпадать с «-» или «+» как допустимое число.
David Mulder 13 авг. 2014, в 18:42
Да, ты прав. Сделано изменение.
mpataki14 15 авг. 2014, в 13:57
Ницца. Я не уверен, что (, | и) делают в этом первом классе символов — насколько мне известно, эти метасимволы теряют свое особое значение внутри класса символов. Как насчет «^ [- +]? [0-9] + $»?
U007D 29 авг. 2015, в 23:12
Показать ещё 2 комментария
isNumber(const std::string &str)
Tomasz 07 июнь 2016, в 11:41
Поделиться
Это тестирует только для целых чисел без знака
no one special 13 фев. 2019, в 10:45
Я нашел следующий код наиболее надежным (С++ 11). Он ловит как целые числа, так и поплавки.
bool isNumber( std::string token )
dk123 26 дек. 2015, в 13:35
Поделиться
Кажется, что строка using namespace std; не нужно
Xam 25 фев. 2018, в 06:25
Вот решение для проверки положительных целых чисел:
bool isPositiveInteger(const std::string& s)
Jaime Soto 15 май 2013, в 21:47
Поделиться
bool isNumber(string line)
предполагая, что любая строка, начинающаяся с 0, является числом, Просто добавьте проверку для этого случая
bool isNumber(const string &line)
ofc «123hello» вернется, как заметил Тони Д.
Noam Geffen 30 март 2014, в 07:38
Поделиться
Простейший, о котором я могу думать в С++
bool isNumber(string s) < if(s.size()==0) return false; for(int i=0;i='0' && s[i] <='9')==false) < return false; >> return true; >
Abhijit Annaldas 14 июль 2016, в 18:42
Поделиться
bool isNumber(const std::string& s)
Как и в случае с ответом Дэвида Ректора, он не устойчив к строкам с несколькими точками или минус-знаками, но вы можете удалить эти символы, чтобы просто проверить целые числа.
Однако я частично согласен с решением, основанным на решении Ben Voigt, используя strtod в cstdlib, чтобы посмотреть десятичные значения, научную/инженерную нотацию, шестнадцатеричную нотацию (С++ 11) или даже INF/INFINITY/NAN (С++ 11):
bool isNumberC(const std::string& s)
chappjc 25 июль 2014, в 00:46
Поделиться
Мы можем использовать класс stringstream.
bool isNumeric(string str) < stringstream stream; double number; stream>number; return stream.eof(); >
rashedcs 02 нояб. 2017, в 08:15
Поделиться
Как мне было показано в ответе на мой родственный вопрос, я чувствую, что вы должны использовать повышение:: преобразование:: try_lexical_convert
NoSenseEtAl 14 март 2017, в 22:48
Поделиться
bool isNumeric(string s)< if ( !s.empty() && s[0] != '-' ) s = "0" + s; //prepend 0 string garbage; stringstream ss(s); ss >> *(auto_ptr(new double)) >> garbage; /* //the line above extracts the number into an anonymous variable. it could also be done like this: double x; ss >> x >> garbage; */ //if there is no garbage return true or else return false return garbage.empty(); >
как это работает: stringload → overload может преобразовывать строки в различные типы арифметических операций он делает это, читая символы последовательно из строкового потока (ss в этом случае), пока не закончится символ ИЛИ следующий символ не будет соответствовать критериям, которые будут сохранены в тип переменной назначения.
stringstream ss("11"); double my_number; ss >> my_number; //my number = 11
stringstream ss("011"); double my_number; ss >> my_number; //my number = 11
stringstream ss("11ABCD"); double my_number; ss >> my_number; //my number = 11 (even though there are letters after the 11)
объяснение переменной «мусор»:
Почему бы просто не проверить, имеет ли значение извлечения в моем двойном значение действительное значение, а затем возвращает true, если оно есть?
Обратите внимание, что пример3 выше все еще успешно прочитает номер 11 в переменной my_number, даже если входная строка «11ABCD» (которая не является числом).
для обработки этого случая мы можем сделать другое извлечение в строковой переменной (которую я назвал мусором), которая может читать все, что могло быть оставлено в буфере строк после первоначального извлечения в переменную типа double. Если что-то осталось, он будет считаться «мусором», что означает, что полная строка, прошедшая мимо, не была числом (она начинается только с одного). в этом случае мы хотели бы вернуть false;
добавленное «0» объяснение «:
попытка извлечь один символ в двойник не сработает (возврат 0 в наш double), но все равно будет перемещать позицию буфера строки после символа. В этом случае наше чтение мусора будет пустым, что приведет к неправильной ошибке функции true. чтобы обойти это, я добавил 0 к строке, чтобы, если, например, строка, переданная в «a», она была изменена на «0a», так что 0 будет извлечен в double, а «a» будет извлечен в мусор.
добавление 0 не повлияет на значение числа, поэтому число будет по-прежнему правильно извлечено в нашу двойную переменную.
KorreyD 22 нояб. 2015, в 05:41
Поделиться
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.