Совместимость C Между целыми числами и символами

StackOverflow https://stackoverflow.com/questions/144134

  •  02-07-2019
  •  | 
  •  

Вопрос

Как C обрабатывает преобразование между целыми числами и символами?Допустим, вы объявили целочисленную переменную и запрашиваете у пользователя число, но вместо этого он вводит строку.Что бы произошло?

Это было полезно?

Решение

Пользовательский ввод обрабатывается как строка, которую необходимо преобразовать в int с помощью atoi или другой функции преобразования.Atoi вернет 0, если строка не может быть интерпретирована как число, поскольку она содержит буквы или другие нечисловые символы.

Вы можете прочитать немного больше в документации atoi на MSDN - http://msdn.microsoft.com/en-us/library/yd5xkb5c (ПРОТИВ 80).aspx

Другие советы

Эээ?Вы всегда вводите строку.Затем вы анализируете преобразование этой строки в число различными способами (повторный запрос, использование значения по умолчанию и т.д.) Обработки различных ошибок (переполнение, неправильные символы и т.д.).

Еще одна вещь, которую следует отметить, - это то, что в C символы и целые числа в некоторой степени "совместимы".Любой символ может быть присвоен int.Обратное также работает, но вы потеряете информацию, если целочисленное значение не поместится в символ.

char foo = 'a'; // The ascii value representation for lower-case 'a' is 97
int bar = foo; // bar now contains the value 97 
bar = 255; // 255 is 0x000000ff in hexadecimal
foo = bar; // foo now contains -1 (0xff) 
unsigned char foo2 = foo; // foo now contains 255 (0xff)

Как отмечали другие люди, данные обычно вводятся в виде строки - вопрос только в том, какая функция используется для выполнения чтения.Если вы используете графический интерфейс, функция может уже обрабатывать преобразование в целое число и сообщать об ошибках и так далее соответствующим образом.Если вы работаете со стандартным C, обычно проще преобразовать значение в строку (возможно, с помощью fgets() а затем преобразуйте.Хотя atoi() может быть использован, но это редко бывает лучшим выбором;проблема заключается в определении того, было ли преобразование успешным (и привело к нулю, потому что пользователь ввел законное представление нуля) или нет.

Как правило, используйте strtol() или один из его родственников (strtoul(), strtoll(), strtoull());для преобразования чисел с плавающей запятой используйте strtod() или аналогичная функция.Преимущества процедур преобразования целых чисел включают в себя:

  • необязательный выбор основания (например, основание 10, или основание 10 - шестнадцатеричное, или основание 8 - восьмеричное, или любое из вышеперечисленных с использованием стандартных соглашений C (007 для восьмеричного числа, 0x07 для шестнадцатеричного, 7 для десятичного).
  • необязательное обнаружение ошибок (путем определения того, где было остановлено преобразование).

Место, куда я обращаюсь за многими из этих спецификаций функций (когда я не смотрю на свою копию фактического стандарта C), - это POSIX веб-сайт (который включает в себя функции C99).Он ориентирован на Unix, а не на Windows.

Программа выйдет из строя, вам нужно вызвать функцию atoi.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top