如何在C中仅通过字母比较包含数字的字符串

How to compare strings containing numbers just by letters in C

我需要在 C 中仅通过字母和数字的外观来比较字母和数字的字符串。

例如字符串 "first%dsecond%dj" 应该被认为等于任何字符串,如 "first[number]second[number]j".

我试过这样做:

char *c_i
int i, j;
if (sscanf(c_i, "first%dsecond%dj", &i, &j) == 2 &&
    c_i[strlen(in) - 2] == 'j') {
    printf("%s", c_i);
}

但 sscanf 会忽略最后一个数字后面的所有内容,因此像 "first%dsecond%dthird%dj" 这样的字符串也会给出真实值并打印出来。

通常 sscanf 只关心最后一个说明符之前的字母值,我想找到一些也计算后面字母的东西,比如检查整个字符串并获取任何数字的比较器但是数.

当然我可以通过创建自己的 char* 扫描器来做到这一点,但如果有更简单的方法,我想避免这种情况。

使用%n获取转换后的长度,然后检查字符串是否真的到此结束:

void checkString(const char *s)
{
  int i, j, n = 0;

  if (sscanf(s, "first%dsecond%dj%n", &i, &j, &n) == 2 && s[n] == '[=10=]') 
  {
    printf("%s", s);
  }
}

的好答案的变体。

使用"%n"记录扫描中的当前位置,使用"*"不需要保存到int

n ... The corresponding argument shall be a pointer to signed integer into which is to be written the number of characters read from the input stream so far by this call to the fscanf function. ... C11 §7.21.6.2 12

An optional assignment-suppressing character *. §7.21.6.2 3

// return true on match
bool IE_compare(const char *c_i) {
  int n = 0;
  sscanf(c_i, "first%*dsecond%*dj%n", &n);
  return n > 0 && c_i[n] == '[=10=]';
}

注意:格式字符串可以编码为单独的字符串文字以供替代阅读。

  sscanf(c_i, "first" "%*d" "second" "%*d" "j" "%n", &n);

以上将匹配数字前的前导空格,如 "first +123second -456j",因为 "%d" 允许这样做。避免:

  int n1, n2,
  int n = 0;
  sscanf(c_i, "first%n%*dsecond%n%*dj%n", &n1, &n2, &n);
  return n > 0 && !isspace((unsigned char) c_i[n1]) && 
      !isspace((unsigned char) c_i[n2]) && c_i[n] == '[=12=]';

以上将匹配带有前导符号的数字,如"first+123second-456j",因为"%d"允许这样做。避免:

  sscanf(c_i, "first%n%*dsecond%n%*dj%n", &n1, &n2, &n);
  return n > 0 && isdigit((unsigned char) c_i[n1]) && 
      isdigit((unsigned char) c_i[n2]) && c_i[n] == '[=13=]';

  // or 
  int n = 0;
  sscanf(c_i, "first%*[0-9]second%*[0-9]j%n", &n);
  return n > 0 && c_i[n] == '[=13=]';

仍然有些不清楚的是,是否需要 出现一个数字。 “......和数字的出现”意味着是的。 "firstsecondj" 应该匹配吗?以上答案假设没有。