#c #c99
#c #c99
Вопрос:
Я пытаюсь понять, смогу ли я, когда я это сделаю
fscanf(inputSTREAM, "$%s$", out)
Я также могу вернуть знаки $ — есть ли способ?
Ответ №1:
Я не думаю, что есть способ получить строку со знаками доллара и непустую строку между ними, используя scanf()
семейство функций. Наиболее близким подходом, вероятно, было бы использование набора сканирования, но наборы сканирования — это не то же самое, что регулярные выражения, и вам понадобится регулярное выражение, чтобы указать шаблон, который вы ищете.
На практике вы, вероятно, могли бы вставить первый знак доллара в строку, используя:
fscanf(inputSTREAM, " %1[$]%[^$]%*[$]", amp;out[0], amp;out[1]);
Вы не можете выполнить тот же трюк для последнего знака доллара, даже если вы знаете точную длину строки. Проблема в том, что вам нужно было бы перезаписать null в конце строки вторым знаком доллара, и вы хотели бы, чтобы после строки был NUL ''
. Добавить последний доллар намного проще, чем вставить первый в начало строки. Третий набор сканирования содержит ‘ *
‘, подавляющий присвоение, и требует доллар в конце. Начальный пробел в формате пропускает пробелы.
Это не гарантированное поведение; первое преобразование записало бы NUL поверх out[1]
, а второе преобразование затем записало бы строку поверх out[1]
, но стандарт C не гарантирует, что это сработает.
#include <stdio.h>
int main(void)
{
char out[20];
scanf(" %1[$]%[^$]%*[$]", amp;out[0], amp;out[1]);
printf("<<%s>>n", out);
return 0;
}
Ответ №2:
Обратите внимание, что во "$%s$"
втором долларах это бесполезно, поскольку %s
означает «последовательность символов, не содержащих пробелов». Итак, завершающий доллар уже отсканирован %s
. Все, что вам нужно сделать, это отсканировать начальный доллар с помощью %c
в начале, например, попробуйте это:
#include <stdio.h>
int main (void)
{
char out[64];
while (fscanf (stdin, " %cbs", amp;out[0], amp;out[1]) == 2 amp;amp; out[0] == '$') {
printf (">>%s<<n", out);
}
return 0;
}
$ ./a.out
$fooo$
>>$fooo$<<
$bar$
>>$bar$<<
$baz $
>>$baz<<
$ boing $
>>$$<<
$ ./a.out
$zap$
>>$zap$<<
$ oink$
>>$oink$<<
^D
$
Обратите внимание, что 62 в bs
на два меньше, чем sizeof out
, чтобы оставить место для начального доллара и конечного 0.
Ответ №3:
Вы могли бы прочитать строку как строку, а затем использовать sscanf для получения значения, для которого вы используете fscanf. Тогда у вас будет исходная строка и значение из sscanf.