Как перевести строку в число c
Перейти к содержимому

Как перевести строку в число c

  • автор:

Как перевести строку в число c

Нередко может возникнуть необходимость объединить строку с данными других типов, например, числами. Однако объединить строку мы можем только с другой строкой. Поэтому данные других типов вначале необходимо преобразовать в строку. Для преобразования в строку применяется функция std:to_string() , в которую передается преобразуемое значение:

#include #include int main() < unsigned age; std::string message< "Age: " + std::to_string(age)>; std::cout 

Функции преобразования из строки в число

Нередко может вощникнуть противиположная задача — преобразовать строку в другой тип. Есть ряд функций, которые преобразуют строку в число определенного типа:

  • stoi() : преобразует в тип int
  • stol() : в long
  • stoll() : в long long
  • stoul() : в unsigned long
  • stoull() : в unsigned long long
  • stof() : в float
  • stod() : в double
  • stold() : в long double

Все они определены в модуле , работают однотипно и в качестве параметра принимают преобразуемую строку:

std::string str< "123" >; int n< std::stoi(str) >; // n == 123

Преобразование строки в указатель на символы

При необходимости можно преобразовать значение типа string в указатель на символы. Для преобразования в указатель на константную строку применяется метод c_str() :

#include #include int main() < std::string message ; const char* message_ptr = message.c_str(); // преобразуем в указатель std::cout

Для получения указателя также можно применять метод data() , который возвращает указатель на неконстантное значение, если объект string не является константой.

#include #include int main() < std::string message ; char* message_ptr = message.data(); // преобразуем в указатель std::cout

Функции преобразования строк в числовые значения

Каждая функция в семействе 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 для расширенных символов; указатель на аргумент конца преобразования в каждой из этих функций для расширенных символов представляет собой строку расширенных символов. В остальном каждая из этих функций для расширенных символов работает так же, как и ее аналог для однобайтовых символов.

Руководство по программированию на 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) метод для преобразования входной строки в 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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

C перевод строки(char) в число(int)

Переменная not_num содержит строку из трех символов-цифр, например «528» . Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num . Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать количество сотен, второй — десятков, а третий — единиц.)

Отслеживать
задан 5 янв 2017 в 11:34
187 1 1 серебряный знак 12 12 бронзовых знаков

Для любого символа c в диапазоне 0..9 числовое значение может быть получено как c — ‘0’ . Можно воспользоваться этим.

5 янв 2017 в 11:45
Так а в чем проблема? Почему просто не воспользоваться функцией strtoul ?
16 июл 2017 в 21:27

@AnT, исходя из подсказки в тексте вопроса проблема в отсутствии представления о кодировках символов (впрочем, семестр уже явно закончился)

16 июл 2017 в 21:36

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

char not_num — может, вы все же имели в виду char*not_num ?

Посмотррите на функции типа atoi или strtol .

P.S. Первое уточнение (интересно, сколько их еще будет? :))

num = 0; char* s = not_num; while(*s)

Отслеживать
ответ дан 5 янв 2017 в 11:38
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

Вот задание: Переменная not_num содержит строку из трех символов-цифр, например «528». Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num. Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать количество сотен, второй — десятков, а третий — единиц.)

5 янв 2017 в 11:40
И там нету нечего по поводу сторонних функции
5 янв 2017 в 11:42
А что в задании написали вы? 🙂 Плохое ТЗ — и результат ХЗ.
5 янв 2017 в 11:43
@AntonShchyrov а что тут нечитабельно? *s++ это классика имхо. А вот скобки можно и убрать)
5 янв 2017 в 11:56
@Harry я ждал тут ответа 100*a[0]+10*a[1]+a[2]-5328 )
5 янв 2017 в 12:07

int num; num = (not_num[0] - '0') * 100 + (not_num[1] - '0') * 10 + (not_num[2] - '0') printf("%d\n", num - 10); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *