Методы замены printf / scanf: необходимы отзывы и советы - PullRequest
2 голосов
/ 09 августа 2010

Я недавно писал некоторые базовые программы для командной строки (я хочу, чтобы мои навыки оставались резкими в течение лета), но printf и scanf начали меня раздражать.Я не замечательный программист на Си, и необходимость в printf / scanf и их нестабильности (или, что еще хуже, fgets и т. Д.) Не совсем утешает меня (по этой причинеточно, я люблю NSLog, с его комфортным пространством имен по умолчанию и его автоматическим синтаксическим анализом NSString и NSObject).

К моему большому разочарованию, NSLog не имеет функции-аналога и печатаетмного лишнего «мусора» (время, имя функции и т. д., а также символ новой строки в конце), что лишает меня смысла в его использовании.Поэтому я решил сесть за другое упражнение по программированию и написать функции для замены printf и scanf, которые бы соответствовали моим потребностям.

И вуаля, я придумал свой собственный файл NSInput.h, содержащий две функции: NSPrint() и NSScan().Эти две функции моделируются значительно после printf и scanf, но также обрабатывают NSString.Я знаю, что я наступаю на священное пространство имен здесь, но я не смог устоять (IFPrint и IFScan просто звучат ужасно!).

Теперь, хотя я действительно счастлив, что у меня есть рабочий код(для которого вы можете найти источник здесь ), я знаю, что это неэффективно (хотя, к моему удивлению, NSPrint в несколько раз эффективнее, чем printf в LLDB в Xcode 4, ноэто не относится к делу).Мне нужен совет о том, как сделать функции лучше и эффективнее.NSScan, например, преобразует va_list, который он получает, в NSPointerArray и использует NSScanner для сканирования формата и ввода строк, поэтому я знаю, что есть много возможностей для улучшения.

По сути, я хочу знать, есть ли какие-то явные ошибки, которые я допустил, которые можно и нужно исправить?Есть что-то огромное, что я пропустил?Должен ли я просто позвонить избалованным и вернуться к использованию printf и scanf?Пожалуйста, скажите мне, я ищу ввод здесь (каламбур не предназначен!) ...

Заранее спасибо!

1 Ответ

3 голосов
/ 09 августа 2010

Мои мысли:

  • Не называйте их NSxxxxx, NS зарезервировано для Какао и Фонда.
  • Обе функции должны быть изменены, чтобы принять FILE*, т. Е. Вы должны моделировать интерфейс для fprintf() и fscanf() для большей гибкости.
  • Ваша функция printf, вероятно, была бы лучше, если бы вы использовали fputs()

, например

void NSFPrint (FILE* fp, NSString *format, ...) 
{
    // Create the variable argument list.
    va_list args;
    va_start(args, format);

    // Using NSString, parse the argument list and convert it to a C string.
    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], fp);
     va_end(args);
}
  • Рассмотрите возможность добавления поддержки ввода и вывода в кодировках, отличных от UTF-8.
  • Ваш заменяющий scanf смешивает буферизованный ввод-вывод C и небуферизованный ввод-вывод Unix на stdin. Это может быть плохо.
  • Ваша замена scanf читает до конца строки, даже если это не нужно. Я не проверил внимательно, но если формат сканирования не занимает всю строку, похоже, вы отбрасываете ввод. Это может быть плохо.
...