Совместимость C между целыми числами и символами - PullRequest
1 голос
/ 27 сентября 2008

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

Ответы [ 5 ]

6 голосов
/ 27 сентября 2008

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

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

3 голосов
/ 27 сентября 2008

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

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

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

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

3 голосов
/ 27 сентября 2008

Еще одна вещь, на которую следует обратить внимание, это то, что в 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)
3 голосов
/ 27 сентября 2008

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

0 голосов
/ 27 сентября 2008

Сбой программы, вам нужно вызвать функцию atoi.

...