我尝试验证一个UUID v4。我尝试使用sscanf完成此操作,如果UUID可以完全被sscanf读取(即读取的字符总数-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
呢? - KamilCuk%1x[89ab]%3x
这将匹配一个1位十六进制数,然后是字面上的[89ab]
字符串,最后是另一个3位十六进制数。 - dxivscanf()
的功能有限。你可能想学习正则表达式,通过fgets()
读取用户输入并通过正则表达式进行检查。或者,编写自己的检查器... - the busybee%1x%3x
改成了%1x [89ab]%3x
。是scanf
文档中的某些内容提示这么做有意义吗? - David Schwartz