【问题标题】:Detect substring in specific format检测特定格式的子字符串
【发布时间】:2016-03-02 21:23:14
【问题描述】:

检测特定格式的子字符串的最简单方法是什么?

例如,考虑 C 中的字符串

"[random characters/symbols] a-b-c [random characters/symbols]"

C 中是否有一个函数可以让我检测格式为“%s-%s-%s”的子字符串?

【问题讨论】:

  • 你的意思是像一个正则表达式?
  • '-' 扫描到 "%s"。您是否希望"%s" 不包括'-'? ``"%s"` 包括所有非空格。
  • 随机字符和符号是否包含空格? a-b-c 部分中的字符是否通过空格与随机材料分开,如图所示?您在寻找三个小写字母吗?三个字母?字母数字?调用代码中是否需要abc对应的值?您可能应该使用%c%1s 来避免第一个%s 吃掉所有非空白,导致- 上的转换失败。

标签: c string format substring


【解决方案1】:

使用 strchr() 或 strnchr() 来检测文字字符串(无模式匹配)。函数 strnchr() 更好,因为您可以指定最大长度来防止缺少空终止符的字符串;但是,它不是 ANSI,所以并非所有语言都有它。如果您使用 strchr(),请确保您防止丢失空终止符。

您可以使用 regcomp() 执行正则表达式搜索字符串。 见regex in C language using functions regcomp and regexec toggles between first and second match

【讨论】:

  • 根据定义,字符串不会缺少空终止符;字符串由空字节终止。一些应该是字符串的字节序列不是因为保存字节的数组中的数据中缺少空终止符,而是这样的字节序列不是字符串。 C 标准第 7.1.1 节 术语定义 中的第一句话是:字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。 字符串以 null 结尾——句号。
  • 是的,这就是定义;但是,语言中没有任何东西可以强制执行它,当它发生时很难找到。您可以声明所有语义;但是,如果您不考虑代码中缺少空终止符,您将面临不稳定的风险。作为 SW 开发人员,我们负责功能、稳定性和可维护性,而不是确保我的花括号在正确的位置。
【解决方案2】:

尝试从字符串中的各个点开始直到成功。

"%*[^- ] 查找不包含'-' 或空格的子字符串。

"%n记录扫描中的偏移量。

#include<stdio.h>

int main(void) {
  char *s = "[random characters/symbols] a-b-c [random characters/symbols]";

  while (*s) {
    int n = 0;
    sscanf(s, "%*[^- ]-%*[^- ]-%*[^- ]%n", &n);
    if (n) {
      printf("Success '%.*s'\n", n, s);
      break;
    }
    s++;
  }
  return 0;
}

输出

Success 'a-b-c'

【讨论】:

  • 有趣的方法,我必须记住这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多