Как Взять пробел во Входе в C

Я склонен использовать языки сценариев для быстрого прототипирования, экспериментирования и пререкания данных. Например, если у меня будет набор текстовых файлов, которые я должен предварительно обработать и встроить в приспособления базы данных как одноразовая операция, я буду обычно писать сценарий этого.

Однако в эти дни строка между 'сценариями' и 'скомпилированный' становится размытой с языками как отличный и рубиновое. Для упомянутой выше задачи я буду использовать рубин, но тогда я буду также использовать его для создания производственного веб-приложения с направляющими. Я запишу, что настольные приложения в Java, но отличный позволяют мне смешивать сценарии также. При записи в C/C++ я нашел, что полезный шаблон должен был встроить зависящий от домена язык сценариев (например, tcl, хотя я не очень люблю тот язык).

фактический выбор языка, я думаю религиозный выбор, хотя существуют некоторые компромиссы, которые очевидны (удобочитаемость, например - жемчуг полезен, но слишком легок для записи загадочных сценариев в. До некоторой степени это - язык 'только для записи':-). В прошлом я использовал bash+awk+sed, некоторый жемчуг, рубин, и т.д. и т.д... Для одного от задач это - главным образом вопрос того, чем Вы и остальная часть Вашей команды довольны. Я делаю сознательный выбор для использования рубина в эти дни, даже если я был бы несколько более быстрым выполнением того же самого в bash/awk/sed, но это должно только улучшить мои рубиновые навыки путем выполнения как можно большего количества задач в нем.

8
задан SLaks 12 October 2009 в 17:02
поделиться

5 ответов

Попробуйте использовать fgets (). Он прочитает полную строку из потока по вашему выбору (stdin, я думаю, вы ищете). Пример для вашего случая:

char address[100];

fgets(address, 100, stdin);

fgets () прочитает самое большее количество символов, переданных во втором аргументе (минус один). Нет переполнения буфера, и вы получите всю строку до символа новой строки включительно (или до EOF). Обратите внимание: поскольку одним из параметров является максимальное количество символов для чтения, возможно, вы получите неполную строку. Проверьте, является ли последний символ в возвращаемой строке "\ n", и вы узнаете, что получили полную строку. Обнаружение EOF тоже довольно просто; возвращаемое значение NULL и проверка на errno должны помочь вам.

Спасибо Крису (ниже) за пункт о частичных строках.

14
ответ дан 5 December 2019 в 07:35
поделиться

Вы можете попробовать что-то вроде этого:

char str[100];
scanf("%99[0-9a-zA-Z ]s", str);
printf("%s\n", str);
7
ответ дан 5 December 2019 в 07:35
поделиться

Есть способов сделать это с помощью 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.
  }
1
ответ дан 5 December 2019 в 07:35
поделиться

См. fgets ()

fgets () считывает не более одного символа меньшего размера из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или новой строки. Если читается новая строка, она сохраняется в буфере. '\ 0' сохраняется после последнего символа в буфере.

char *fgets(char *s, int size, FILE *stream);

Дополнительные сведения доступны во многих вопросах SO, например input-string-through-scanf .

(По многочисленным просьбам , ссылка на gets () была удалена)

0
ответ дан 5 December 2019 в 07:35
поделиться

Лично я бы использовал fgets, но это уже было указано здесь. Один из способов сделать это с помощью scanf - это

scanf("%[^\n]", address);

. Он принимает все символы, пока не будет найден '\ n'.

0
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: