【发布时间】:2020-12-15 21:28:07
【问题描述】:
我尝试验证 UUID v4。我尝试使用 sscanf 执行此操作,如果可以使用 sscanf 完整读取 UUID(= 读取的字符总数 - 36),我认为这是一个正确的 UUID。到目前为止我的代码:
#include <stdio.h>
int main()
{
char uuid[ 37 ] = "da4dd6a0-5d4c-4dc6-a5e3-559a89aff639";
int a = 0, b = 0, c = 0, d = 0, e = 0, g = 0;
long long int f = 0;
printf( "uuid >%s<, variables read: %d \n", uuid, sscanf( uuid, "%8x-%4x-4%3x-%1x%3x-%12llx%n", &a, &b, &c, &d, &e, &f, &g ) );
printf( " a - %x, b - %x, c - %x, d - %x, e - %x, f - %llx, total number of characters read - %d \n", a, b, c, d, e, f, g );
return 0;
}
返回以下输出
uuid >da4dd6a0-5d4c-4dc6-a5e3-559a89aff639<, variables read: 6
a - da4dd6a0, b - 5d4c, c - dc6, d - a, e - 5e3, f - 559a89aff639, total number of characters read - 36
到目前为止,一切正常。
现在我想包括,第三个连字符之后的第一个字符必须是 [89ab] 之一。所以我将%1x%3x 更改为%1x[89ab]%3x。但是现在,第一个字符被读取,其余的不再读取。
输出:
uuid >da4dd6a0-5d4c-4dc6-a5e3-559a89aff639<, variables read: 4
a - da4dd6a0, b - 5d4c, c - dc6, d - a, e - 0, f - 0, total number of characters read - 0
我错过了什么?语法有什么问题?可以这样读吗?我尝试了几种扫描集和说明符的组合,但没有任何效果。
【问题讨论】:
-
那么为什么不
d == 0xa || d == 0x9 || d == 0xb || f == 0x8? -
字符集格式只读取字符串。
%1x[89ab]%3x这匹配一个 1 位十六进制数字,然后是文字[89ab]字符串,然后是另一个 3 位十六进制数字。 -
好吧,
scanf()的功能有限。您可能想了解正则表达式,通过fgets()阅读用户的输入并通过正则表达式进行检查。或者,编写自己的检查器... -
“所以我把
%1x%3x改成了%1x[89ab]%3x。”scanf文档中的某些内容是否表明这是有道理的? -
@David Schwartz 是的,当我阅读 scanf 的文档时,我发现没有任何限制。现在我在文档下面看到了关于类型的注释。