繁体   English   中英

使用sscanf验证十六进制格式的命令字符串

[英]Validate command string in hexa decimal format with sscanf

我将收到格式为“%04hx%04hx”的命令参数字符串。 示例命令参数字符串为“ 09EC 000A”。

我需要检查数据格式是否有效。 我试图用以下格式字符串检查参数字符串是否有效

“%[0123456789abcdefABCDEF] s”。 即使在十六进制数字之间存在多个空格且前导空格也存在的情况下,此格式也将起作用。

是否可以使用sscanf检查命令参数字符串是否只有两个4位十六进制数字,并且它们之间有一个空格?

马努

是否可以使用sscanf检查命令参数字符串是否只有两个4位十六进制数字,并且它们之间有一个空格?

是的,检查每个字符,并用"%n"保存字符扫描计数。

  // notice no 's' at the end
  #define HEX1 "%*1[0123456789abcdefABCDEF]"
  // the '*' directs sscanf() to not save the result.
  #define SPC1 "%*1[ ]"

  char *sample = "09EC 000A";
  int n = 0;
  sscanf(sample, HEX1 HEX1 HEX1 HEX1 SPC1 HEX1 HEX1 HEX1 HEX1 "%n", &n);
  if (n && sample[n] == 0) {
    puts("Success");
  } else {
    puts("Fail");
  }

或者可以使用sscanf()的返回值并使用前哨检测尾随字符。

  char hex[2][5] = { 0 };
  char sentinel;
  #define HEX "%1[0123456789abcdefABCDEF]"
  //#define SPC1 "%*1[ ]"
  if (8 == sscanf(sample, HEX HEX HEX HEX SPC1 HEX HEX HEX HEX "%c",
      &hex[0][0], &hex[0][1], &hex[0][2], &hex[0][3],
      &hex[1][0], &hex[1][1], &hex[1][2], &hex[1][3],
      &sentinel)) {
    printf("Success %s %s\n", hex[0], hex[1]);
  } else {
    puts("Fail");
  }

或也许不太冗长

  #define HEX4 "%4[0123456789abcdefABCDEF]"
  sscanf(sample, HEX4 SPC1 HEX4 "%n", hex[0], hex[1], &n);
  if (n == 9 && sample[n] == 0) {
    printf("Success %s %s\n", hex[0], hex[1]);
  } else {
    puts("Fail");
  }

直接使用"%x"允许可选的前导空格字符。 可以使用"%n"进行检测。 然而"%x"允许"0x12""+123""-123" ,但在以下情况中无效。

  int m[4] = { 0 };
  unsigned cmd[2];
  sscanf(sample, " %n%x%n" SPC1 " %n%x%n",
      &m[0], &cmd[0], &m[1],
      &m[2], &cmd[1], &m[3]);
  if (m[0] == 0 && m[1] == 4 && m[2] == 5 && m[3] == 9 && sample[m[3]] == 0) {
    printf("Success %04x %04x\n", cmd[0], cmd[1]);
  } else {
    puts("Fail");
  }

许多可能性。

sscanf可能无法轻松做到这一点。 使用正则表达式或编写您自己的验证函数:

#include <ctype.h>
int is_valid (const char *s)
{
    int i = 0;
    for(; i < 4; i++) if (!isxdigit((unsigned char)s[i])) return 0;
    /* change the next line to (s[i++]!=' ') if wanted */
    if (!isspace((unsigned char)s[i++])) return 0; 
    for(; i < 9; i++) if (!isxdigit((unsigned char)s[i])) return 0;
    return 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM