Есть ли способ включить исходные параметры в fscanf на C

#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.