Совместимость C Между целыми числами и символами
-
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.