在C中的fscanf中包含原始参数的任何方法

在C中的fscanf中包含原始参数的任何方法,c,c99,C,C99,我想看看我什么时候能做到 fscanf(inputSTREAM, "$%s$", out) 我还可以返回$符号-有办法吗?您可以将该行作为字符串读取,然后使用sscanf获取使用fscanf的值。然后您将获得原始字符串和sscanf中的值。我认为没有办法使用scanf()函数族检索带美元符号的字符串和它们之间的非空字符串。最接近的方法可能是使用扫描集,但扫描集与正则表达式不同,您需要正则表达式来指定要查找的模式 实际上,您可以使用以下方法将第一个美元符号输入字符串: fscanf(inpu

我想看看我什么时候能做到

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

我还可以返回$符号-有办法吗?

您可以将该行作为字符串读取,然后使用sscanf获取使用fscanf的值。然后您将获得原始字符串和sscanf中的值。

我认为没有办法使用
scanf()
函数族检索带美元符号的字符串和它们之间的非空字符串。最接近的方法可能是使用扫描集,但扫描集与正则表达式不同,您需要正则表达式来指定要查找的模式


实际上,您可以使用以下方法将第一个美元符号输入字符串:

fscanf(inputSTREAM, " %1[$]%[^$]%*[$]", &out[0], &out[1]);
即使你知道绳子的确切长度,你也不能为后一个美元符号做同样的特技。问题是您需要用第二个美元符号覆盖字符串末尾的null,并且在字符串后面需要一个NUL
'\0'
。添加最后一个美元要比在字符串开头插入第一个美元容易得多。第三个扫描集包含一个抑制“
*
”的赋值,并且在末尾需要一美元。格式中的前导空格跳过空格

这不是保证的行为;第一次转换将在
out[1]
上写入NUL,第二次转换将在
out[1]
上写入字符串,但C标准并不保证它能正常工作

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

    scanf(" %1[$]%[^$]%*[$]", &out[0], &out[1]);
    printf("<<%s>>\n", out);
    return 0;
}
#包括
内部主(空)
{
字符输出[20];
scanf(“%1[$]%[^$]%*[$]”、&out[0]、&out[1]);
printf(“\n”,out);
返回0;
}
请注意,在
“$%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
$
#包括
内部主(空)
{
字符输出[64];
而(fscanf(stdin,“%c%62s”、&out[0]、&out[1])==2&&out[0]===“$”){
printf(“>>”%s