Я пытаюсь выяснить, как именно работает scanf
. Если я код что-то вроде этого:Понимание Scanf - обработка форматированного ввода
scanf("%s %d %f", name, &age, &wage);
введите в качестве стандартного ввода:
james 20 34000.25
, а затем распечатать имя, возраст и заработной платы соответственно, я получаю именно то, что можно было бы ожидать, то же самое как я ввел в стандартный ввод. Однако, если я введу что-то вроде этого:
scanf("%s/%d/%f", name, &age, &wage);
и я вхожу в качестве стандартного ввода:
james/20/34000.25
я получаю строку james/20/34000.25
для значения строки и 0 и 0.00000 соответственно для целой и плавающей точкой значения. Я думал, что scanf
будет обрабатывать косые черты так же, как обрабатывать пробелы в первой версии. Как я могу получить это, если пользователь вводит значение, разделенное косой чертой, я могу соответствующим образом присваивать значения переменным?
В каждом ответе, который я когда-либо видел о scanf, есть что-то * решающее * отсутствует.Как вы узнаете, были ли успешно сопоставлены спецификации формата '% s','% d', '% f','% [^ /] или '% [^ /]? Что произойдет, если пользователь просто нажмет CTRL + Z в Windows или CTRL + d в Linux, чтобы закрыть stdin? scanf * возвращает *, и ваша программа счастлива использовать значения мусора? Что сканирует f * return *? * Scanf должен это сделать! Почему это так, вместо этого? * Потому что это [руководство] (http://pubs.opengroup.org/onlinepubs/009695399/functions/scanf.html). У вас * вы * прочитали руководство? – Sebivor
... и в некоторых случаях возвращаемое значение не игнорируется; Он сравнивается с -1 для проверки ошибок файлов, но не против какого-либо * положительного * числа для проверки ошибок преобразования! -sigh- Зачем задавать вопросы, прежде чем пытаться прочитать руководство? Руководство отвечает на ваши вопросы, прежде чем они станут проблемами; У каждой проблемы, которую вы проводите в течение часа, есть руководство, которое вы могли бы прочитать, чтобы решить еще пятьдесят проблем (в дополнение к этому). Не говоря уже о том, чтобы перетащить в него другие человеческие часы ... Почему были написаны руководства, если их не читали те, кто узнал о соответствующих функциях? – Sebivor
Это очень трудно узнать из руководства, когда вы не сталкиваетесь с реальной проблемой. Я читаю больше, чем большинство программистов, но я все еще редко чувствую, что знаю кое-что, пока мне не пришлось отлаживать его и бороться с ним лично. Кроме того, руководство C не является образцом ясности, и это помогает реальным людям указать, что конкретно неправильно с MY кодом. Тем не менее, спасибо за информацию! – user1427661