Как из строки получить число c
Нередко в программах встречается ситуация, когда надо преобразовать число в строку или строку в число. Для этой цели в стандартной библиотеке языка С определены функции strtol() и snprintf() .
Из строки в число. strtol
Функция strtol() преобразует строку в число типа long int . Функция определена в заголовочном файле stdlib.h и имеет следующий прототип:
long strtol(const char *restrict str, char **restrict str_end, int base);
- str — строка с числом, которое надо преобразовать в числовой тип. Ключевое слово restrict указывает компилятору оптимизировать код и что никакой другой параметр не будет указывать на адрес данного параметра.
- str_end — указатель на последний символ строки. Данный параметр можно игнорировать, передавая ему значение NULL
- base — основание, система исчисления, в которую надо преобразовать данные (значение от 2 до 36).
Результатом функции является преобразованное число типа long .
Например, преобразуем строку в число в десятичной системе:
#include #include int main(void) < const char * str = "24 flowers"; long result = strtol(str, NULL, 10); printf("Result: %ld\n", result); // Result: 24 return 0; >
В примере выше второй параметр функции никак не использовался — мы ему передавали значение NULL , и функция нормально работала. Однако он может быть полезен, если нам надо получить остаток строки, которая идет после числа:
#include #include int main(void) < const char * str = "24 flowers"; char* str_end; long result = strtol(str, &str_end, 10); printf("Result: %ld\n", result); // Result: 24 printf("Rest of the string:%s\n", str_end); // Rest of the string: flowers return 0; >
Из числа в строку. snprintf
Функция snprintf() преобразует число в отформатированную строку. Функция определена в заголовочном файле stdio.h и имеет следующий прототип:
int snprintf(char *restrict str_buffer, size_t buffer_size, const char *restrict format, . );
- str_buffer — строка, в которую помещается преобразованное число.
- buffer_size — максимальное количество символов строки. Функция записывает в строку buffer-size — 1 байт и добавляет концевой нулевой байт
- format — задает формат преобразования в строку.
При успешном преобразовании функция возвращает количество символов, записанных в строку (исключая концевой нулевой байт). При неудачном преобразовании возвращается отрицательное число.
#include int main(void) < int number = 354; char str [10]; snprintf(str, sizeof str, "%d", number); printf("Result: %s\n", str); // Result: 354 return 0; >
При этом строка форматирования может содержать множество параметров:
#include int main(void) < int count = 3; double price = 79.99; char str [50]; snprintf(str, sizeof str, "Count: %d \tPrice: %.2f", count, price); printf("%s\n", str); // Count: 3 Price: 79.99 return 0; >
Функции преобразования строк в числовые значения
Каждая функция в семействе strto* преобразует строку, завершаемую null, в числовое значение. Доступные функции перечислены в следующей таблице.
| Function | Description |
|---|---|
| strtod | Преобразует строку в значение двойной точности с плавающей запятой |
| strtol | Преобразуют строку в целое число типа long |
| strtoul | Преобразуют строку в целое число без знака типа unsigned long |
| _strtoi64 | Преобразует строку в 64-разрядное целое число типа __int64 |
| _strtoui64 | Преобразует строку в беззнаковое 64-разрядное целое число типа __int64 |
wcstod , wcstol , wcstoul и _wcstoi64 — это версии с расширенными символами функций strtod , strtol , strtoul и _strtoi64 соответственно. Строковый аргумент каждой из этих функций для расширенных символов представляет собой строку расширенных символов; каждая функция ведет себя так же, как и эквивалентная функция для однобайтовых символов.
Функция strtod принимает два аргумента: первая — входная строка, а второй — указатель на символ, который заканчивает процесс преобразования. strtol , strtoul _strtoi64 и _strtoui64 принимает третий аргумент в качестве базы чисел для использования в процессе преобразования.
Входная строка представляет собой последовательность символов, которые могут обрабатываться как числовое значение указанного типа. Каждая функция перестает читать строку на первом символе, которую она не может распознать как часть числа. Этот символ может быть завершающим символом NULL. Для strtol , strtoul , _strtoi64 и _strtoui64 этот конечный символ также может быть первым числовым символом, который больше определенного пользователем основания системы счисления или равен ему.
Если предоставленный пользователем указатель на символ завершения преобразования не задан NULL или nullptr во время вызова, указатель на символ, остановивший сканирование, будет сохранен там. Если выполнить преобразование невозможно (не найдены допустимые цифры или указано недопустимое основание), по этому адресу сохраняется значение указателя на строку.
strtod ожидает строку следующего вида:
Может whitespace состоять из пробелов или символов табуляции, которые игнорируются; sign либо плюс ( + ), либо минус ( — ); и digits являются одним или несколькими десятичными цифрами. Если перед символом основания системы счисления нет никаких цифр, то после него должна отображаться хотя бы одна цифра. За десятичными цифрами может следовать показатель степени, который состоит из вводной буквы ( d , D , e или E ) и при необходимости целого числа со знаком. Если экспонентная часть или радикс не отображается, предполагается, что символ радикса следует за последней цифрой в строке. Первый символ, который не соответствует этой форме, останавливает сканирование.
Функции strtol , strtoul , _strtoi64 и _strtoui64 ожидают строку следующего вида:
Если базовый аргумент составляет от 2 до 36, он используется в качестве основы числа. Если это значение 0, для определения базы используются начальные символы, на которые ссылается указатель завершения преобразования. Если первый символ равен 0, а второй символ не является x или X, строка интерпретируется как восьмеричное целое число; в противном случае он интерпретируется как десятичное число. Если первый символ — 0, а второй символ равен x или X, строка интерпретируется как шестнадцатеричное целое число. Если первый символ — от 1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с присвоенными значениями меньше base . strtoul и _strtoui64 допускают в качестве префикса знак плюса ( + ) или знак минуса ( — ); знак минуса перед числом показывает, что возвращаемое значение отрицательное.
Выходное значение зависит от параметра LC_NUMERIC категории языкового стандарта. Дополнительные сведения см. в разделе setlocale . Версии этих функций без суффикса _l используют текущий языковой стандарт для данного поведения, зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако они используют переданный параметр языкового стандарта.
Если значение, возвращаемое этими функциями, приведет к переполнению или переполнению или, когда преобразование невозможно, возвращаются специальные значения регистра, как показано ниже.
| Функция | Condition | Возвращенное значение |
|---|---|---|
| strtod | Overflow | +/- HUGE_VAL |
| strtod | Потеря точности или отсутствие преобразования | 0 |
| strtol | Переполнение + | LONG_MAX |
| strtol | Переполнение – | LONG_MIN |
| strtol | Потеря точности или отсутствие преобразования | 0 |
| _strtoi64 | Переполнение + | _I64_MAX |
| _strtoi64 | Переполнение – | _I64_MIN |
| _strtoi64 | Преобразование не выполнено | 0 |
| _strtoui64 | Overflow | _UI64_MAX |
| _strtoui64 | Преобразование не выполнено | 0 |
_I64_MAX , _I64_MIN и _UI64_MAX определены в .
Функции wcstod , wcstol , wcstoul , _wcstoi64 и _wcstoui64 — это, соответственно, версии функций strtod , strtol , strtoul , _strtoi64 и _strtoui64 для расширенных символов; указатель на аргумент конца преобразования в каждой из этих функций для расширенных символов представляет собой строку расширенных символов. В остальном каждая из этих функций для расширенных символов работает так же, как и ее аналог для однобайтовых символов.
Как изьять из строки числа? С++
Дано натуральное число n. От данного числа вычтем сумму цифр этого числа, от полученного числа опять вычтем сумму цифр образованного числа и т. Д. Данную операцию над числом будем выполнять, пока образовано число положительное. Сколько раз будем выполнять данную операцию.
Так вот, я хочу сделать строку (а не число) и потом из неё тягать цифры..Можете подсказать как это воплотить в коде?
Отслеживать
задан 31 июл 2016 в 9:33
468 2 2 золотых знака 11 11 серебряных знаков 26 26 бронзовых знаков
А можно задание перевести на русский или хотя бы на английский:)?
31 июл 2016 в 9:36
@yrHeTaTeJlb, Дано натуральное число n. От данного числа вычтем сумму цифр этого числа, от полученного числа опять вычтем сумму цифр образованного числа и т. Д. Данную операцию над числом будем выполнять, пока образовано число положительное. Сколько раз будем выполнять данную операцию.
31 июл 2016 в 9:37
@goodalien1125: Вот этот текст и положите в вопрос.
31 июл 2016 в 9:45
@goodalien1125, Это можно сделать без использования строк. Получится проще и эффективнее
31 июл 2016 в 9:49
@yrHeTaTeJlb, Да я знаю..но хотел попробовать так..
31 июл 2016 в 9:55
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
перевести число в строку:
std::string s = std::to_string(number); // требует C++11
Если Вам нужна с-строка, то
const char buffer[80]; sprintf(buffer, "%d", number);
Получить числовое выражение символа цифры из символа:
int numeric_digit_value = char_digit_value - '0'; // гарантируется стандартом
Наоборот, из строки в число:
std::string string_value("42"); int numeric_value = std::stoi(string_value); // требует С++11
А вообще, чтобы получить сумму цифр, переводить число в строку не нужно
unsigned sum_of_digits(unsigned value) < unsigned sum = 0; while (value >0) < sum += value % 10; value /= 10; >>
Отслеживать
ответ дан 31 июл 2016 в 9:40
7,461 14 14 серебряных знаков 31 31 бронзовый знак
Не могу понять, как написать..подскажите. И к тому же, мне надо из строки в инт
31 июл 2016 в 9:46
Условно задачу можно разделить на несколько частей.
Преобразование числа в строку
В этом нам поможет std::stringstream
#include #include #include int main() < int value = 123; std::stringstream sstream; sstream
Перебор всех символов строки
Строка это ничто иное как массив char. Перебирать символы можно при помощи оператора []
#include #include int main() < std::string str("123"); for(int i = 0; i < str.size(); ++i)< std::cout >
#include #include int main() < std::string str("123"); std::string::iterator begin = str.begin(); std::string::iterator end = str.end(); while(begin != end)< std::cout >
Преобразование символа char в число int
В стандартной библиотеке C++ нет функции, которая выполняет такое преобразование, но её несложно написать самому
#include #include int charToInt(char c) < return c - '0'; >int main() < char c = '9'; int i = charToInt(c); std::cout
Просуммировать все значения
Можно сделать это вручную при помощи цикла. Но есть алгоритм из std, который может это сделать.
#include #include #include int charToInt(char c) < return c - '0'; >int add(int i, char c) < return i + charToInt(c); >int main() < std::string str = "123"; int summ = std::accumulate(str.begin(), str.end(), 0, add); std::cout
Руководство по программированию на C#. Преобразование строки в число
Для преобразования string в число используется вызов метода Parse или TryParse , который можно найти в числовых типах ( int , long , double и т. д.), или используются методы в классе System.Convert.
Немного эффективнее и проще вызвать метод TryParse (например, int.TryParse("11", out number) ) или метод Parse (например, var number = int.Parse("11") ). Использование метода Convert более удобно для общих объектов, реализующих IConvertible.
Можно использовать методы Parse или TryParse в числовом типе, который предположительно содержит строка, таком как тип System.Int32. Метод Convert.ToInt32 использует Parse внутри себя. Метод Parse возвращает преобразованное число; метод TryParse возвращает логическое значение, которое указывает, успешно ли выполнено преобразование, и возвращает преобразованное число в параметр out . Если строка имеет недопустимый формат, Parse создает исключение, а TryParse возвращает значение false . В случае сбоя операции синтаксического анализа при вызове метода Parse вы всегда должны использовать обработку исключений, чтобы перехватить FormatException.
Вызов метода Parse или TryParse
Методы Parse и TryParse игнорируют пробелы в начале и в конце строки, но все остальные символы должны быть символами, которые образуют соответствующий числовой тип ( int , long , ulong , float , decimal и т. д.). Любые пробелы в строке, образующие число, приводят к ошибке. Например, можно использовать для decimal.TryParse синтаксического анализа "10", "10,3" или "10", но этот метод нельзя использовать для синтаксического анализа 10 из "10X", "1 0" (обратите внимание на внедренное пространство), "10,3" (обратите внимание на внедренное пространство), "10e1" ( float.TryParse здесь работает) и т. д. Строку со значением null или String.Empty невозможно успешно проанализировать. Вы можете проверить наличие NULL или пустой строки, прежде чем пытаться ее проанализировать, вызвав метод String.IsNullOrEmpty.
В указанном ниже примере демонстрируются успешные и неуспешные вызовы методов Parse и TryParse .
using System; public static class StringConversion < public static void Main() < string input = String.Empty; try < int result = Int32.Parse(input); Console.WriteLine(result); >catch (FormatException) < Console.WriteLine($"Unable to parse ''"); > // Output: Unable to parse '' try < int numVal = Int32.Parse("-105"); Console.WriteLine(numVal); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: -105 if (Int32.TryParse("-105", out int j)) < Console.WriteLine(j); >else < Console.WriteLine("String could not be parsed."); >// Output: -105 try < int m = Int32.Parse("abc"); >catch (FormatException e) < Console.WriteLine(e.Message); >// Output: Input string was not in a correct format. const string inputString = "abc"; if (Int32.TryParse(inputString, out int numValue)) < Console.WriteLine(numValue); >else < Console.WriteLine($"Int32.TryParse could not parse '' to an int."); > // Output: Int32.TryParse could not parse 'abc' to an int. > >
В следующем примере показан один из подходов к анализу строки, которая, как ожидается, будет включать начальные числовые символы (включая шестнадцатеричные символы) и конечные нечисловые символы. Он назначает допустимые символы в начале новой строки перед вызовом метода TryParse. Поскольку анализируемые строки содержат небольшое количество символов, в примере вызывается метод String.Concat для назначения допустимых символов новой строке. Для большей строки можете использовать класс StringBuilder.
using System; public static class StringConversion < public static void Main() < var str = " 10FFxxx"; string numericString = string.Empty; foreach (var c in str) < // Check for numeric characters (hex in this case) or leading or trailing spaces. if ((c >= '0' && c = 'A' && char.ToUpperInvariant(c) else < break; >> if (int.TryParse(numericString, System.Globalization.NumberStyles.HexNumber, null, out int i)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' 10FFxxx' --> ' 10FF' --> 4351 str = " -10FFXXX"; numericString = ""; foreach (char c in str) < // Check for numeric characters (0-9), a negative sign, or leading or trailing spaces. if ((c >= '0' && c else < break; >> if (int.TryParse(numericString, out int j)) < Console.WriteLine($"'' --> '' --> "); > // Output: ' -10FFXXX' --> ' -10' --> -10 > >
Вызов методов класса Convert
В следующей таблице перечислены некоторые методы класса Convert, которые можно использовать для преобразования строки в число.
| Числовой тип | Метод |
|---|---|
| decimal | ToDecimal(String) |
| float | ToSingle(String) |
| double | ToDouble(String) |
| short | ToInt16(String) |
| int | ToInt32(String) |
| long | ToInt64(String) |
| ushort | ToUInt16(String) |
| uint | ToUInt32(String) |
| ulong | ToUInt64(String) |
В данном примере вызывается метод Convert.ToInt32(String) для преобразования входных данных string в значение типа int. Пример перехватывает два наиболее распространенных исключения, которые могут создаваться этим методом, — FormatException и OverflowException. Если итоговое число можно увеличить, не превышая Int32.MaxValue, пример добавляет 1 к результату и отображает вывод.
using System; public class ConvertStringExample1 < static void Main(string[] args) < int numVal = -1; bool repeat = true; while (repeat) < Console.Write("Enter a number between −2,147,483,648 and +2,147,483,647 (inclusive): "); string? input = Console.ReadLine(); // ToInt32 can throw FormatException or OverflowException. try < numVal = Convert.ToInt32(input); if (numVal < Int32.MaxValue) < Console.WriteLine("The new value is ", ++numVal); > else < Console.WriteLine("numVal cannot be incremented beyond its current value"); >> catch (FormatException) < Console.WriteLine("Input string is not a sequence of digits."); >catch (OverflowException) < Console.WriteLine("The number cannot fit in an Int32."); >Console.Write("Go again? Y/N: "); string? go = Console.ReadLine(); if (go?.ToUpper() != "Y") < repeat = false; >> > > // Sample Output: // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 473 // The new value is 474 // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): 2147483647 // numVal cannot be incremented beyond its current value // Go again? Y/N: y // Enter a number between -2,147,483,648 and +2,147,483,647 (inclusive): -1000 // The new value is -999 // Go again? Y/N: n
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.