Я склонен использовать языки сценариев для быстрого прототипирования, экспериментирования и пререкания данных. Например, если у меня будет набор текстовых файлов, которые я должен предварительно обработать и встроить в приспособления базы данных как одноразовая операция, я буду обычно писать сценарий этого.
Однако в эти дни строка между 'сценариями' и 'скомпилированный' становится размытой с языками как отличный и рубиновое. Для упомянутой выше задачи я буду использовать рубин, но тогда я буду также использовать его для создания производственного веб-приложения с направляющими. Я запишу, что настольные приложения в Java, но отличный позволяют мне смешивать сценарии также. При записи в C/C++ я нашел, что полезный шаблон должен был встроить зависящий от домена язык сценариев (например, tcl, хотя я не очень люблю тот язык).
фактический выбор языка, я думаю религиозный выбор, хотя существуют некоторые компромиссы, которые очевидны (удобочитаемость, например - жемчуг полезен, но слишком легок для записи загадочных сценариев в. До некоторой степени это - язык 'только для записи':-). В прошлом я использовал bash+awk+sed, некоторый жемчуг, рубин, и т.д. и т.д... Для одного от задач это - главным образом вопрос того, чем Вы и остальная часть Вашей команды довольны. Я делаю сознательный выбор для использования рубина в эти дни, даже если я был бы несколько более быстрым выполнением того же самого в bash/awk/sed, но это должно только улучшить мои рубиновые навыки путем выполнения как можно большего количества задач в нем.
Попробуйте использовать fgets (). Он прочитает полную строку из потока по вашему выбору (stdin, я думаю, вы ищете). Пример для вашего случая:
char address[100];
fgets(address, 100, stdin);
fgets () прочитает самое большее количество символов, переданных во втором аргументе (минус один). Нет переполнения буфера, и вы получите всю строку до символа новой строки включительно (или до EOF). Обратите внимание: поскольку одним из параметров является максимальное количество символов для чтения, возможно, вы получите неполную строку. Проверьте, является ли последний символ в возвращаемой строке "\ n", и вы узнаете, что получили полную строку. Обнаружение EOF тоже довольно просто; возвращаемое значение NULL
и проверка на errno
должны помочь вам.
Спасибо Крису (ниже) за пункт о частичных строках.
Вы можете попробовать что-то вроде этого:
char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
Есть способов сделать это с помощью scanf ()
, но, по моему скромному мнению, они быстро становятся уродливыми. Обычный шаблон (который, к удивлению, еще не упоминался) - это считывание строки с помощью fgets ()
, а затем использование sscanf ()
для ее обработки. sscanf ()
работает аналогично scanf ()
, только вместо обработки стандартного входного потока он обрабатывает строку, которую вы ему передаете (точно так же printf ()
и sprintf ()
связаны между собой). Основы:
char s[100], str[100];
int i, x;
fgets(s, 100, stdin);
if(sscanf(s, "%d %x %s", &i, &x, str) != 3)
{
// our three variables weren't all set - probably an invalid string
// either handle the error or set default values here.
}
См. fgets ()
fgets ()
считывает не более одного символа меньшего размера из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. '\ 0' сохраняется после последнего символа в буфере.
char *fgets(char *s, int size, FILE *stream);
Дополнительные сведения доступны во многих вопросах SO, например input-string-through-scanf .
(По многочисленным просьбам , ссылка на gets ()
была удалена)
Лично я бы использовал fgets, но это уже было указано здесь. Один из способов сделать это с помощью scanf - это
scanf("%[^\n]", address);
. Он принимает все символы, пока не будет найден '\ n'.