Любой способ включить оригинальные параметры в fscanf в C - PullRequest
0 голосов
/ 12 апреля 2011

Я пытаюсь выяснить, могу ли я когда-либо

fscanf(inputSTREAM, "$%s$", out) 

вернуть также знаки $ - есть ли способ?

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

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


На практике вы могли бы получить первый знак доллара в строке, используя:

fscanf(inputSTREAM, " %1[$]%[^$]%*[$]", &out[0], &out[1]);

Вы не можете использовать тот же трюк для последнего знака доллара, даже если знаете точную длину строки. Проблема в том, что вам нужно переписать нулевое значение в конце строки вторым знаком доллара, и вам нужно NUL '\0' после строки. Добавить последний доллар гораздо проще, чем первый в начале строки. Третий набор содержит подавляющий присвоение '*' и требует в конце доллар. Ведущий пробел в формате пропускает пробелы.

Это не гарантированное поведение; первое преобразование записывает NUL через out[1], а второе преобразование затем записывает строку через out[1], но стандарт C не гарантирует, что он будет работать.

#include <stdio.h>
int main(void)
{
    char out[20];

    scanf(" %1[$]%[^$]%*[$]", &out[0], &out[1]);
    printf("<<%s>>\n", out);
    return 0;
}
1 голос
/ 12 апреля 2011

Обратите внимание, что в "$%s$" второй доллар бесполезен, так как %s означает «последовательность символов, не являющихся пробелами».Таким образом, завершающий доллар уже сканируется %s.Все, что вам нужно сделать, это отсканировать начальный доллар с %c в начале, например, попробуйте это:

#include <stdio.h>

int main (void)
{
    char out[64];

    while (fscanf (stdin, " %c%62s", &out[0], &out[1]) == 2 && 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 в %62s в два раза меньше sizeof out, чтобы оставить местоначальный доллар и окончание 0.

0 голосов
/ 12 апреля 2011

Вы можете прочитать строку как строку, а затем использовать sscanf, чтобы получить значение, для которого вы используете fscanf. Тогда у вас будет оригинальная строка и значение из sscanf.

...