我试着看看当我做
fscanf(inputSTREAM, "$%s$", out)
我也可以返回$符号-有一种方法吗?
我不认为有一种方法来检索字符串与美元符号和它们之间的非空白字符串使用scanf()
家族的函数。最接近的方法可能是使用扫描集,但扫描集与正则表达式不同,您需要一个正则表达式来指定您正在查找的模式。
在实践中,您可能会使用:
将第一个美元符号放入字符串中fscanf(inputSTREAM, " %1[$]%[^$]%*[$]", &out[0], &out[1]);
对于后一个美元符号,即使您知道字符串的确切长度,也不能使用相同的技巧。问题是,您需要用第二个美元符号覆盖字符串末尾的null,并且您希望在字符串之后使用NUL ' '
。添加最后一个美元比在字符串的开头插入第一个美元要容易得多。第三个扫描集包含一个赋值抑制' *
',并在末尾需要一个美元。格式的前导空格会跳过空格。
这不是保证行为;第一次转换将在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;
}
请注意,在"$%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
$
请注意,%62s
中的62比sizeof out
少2,以便为初始美元和结束0留出空间。
您可以将该行作为字符串读取,然后使用sscanf来获取您正在使用fscanf获取的值。然后你就有了原始字符串和来自sscanf的值。