删除 C 中的多字符常量

removing multi-char constants in C

这是我在一个非常古老的 C 库中找到的一些代码,它试图从文件中删除空格...

  while(
    (line_buf[++line_idx] != ' ')  &&
    (line_buf[  line_idx] != '  ') &&
    (line_buf[  line_idx] != ',')  &&
    (line_buf[  line_idx] != '[=10=]') )
  {

This great thread 解释了 问题是什么 ,但大多数答案是 "just ignore it" 或 "you should never do this"。然而,我没有看到规范的解决方案。谁能提供一种使用 "proper way"?

编写此测试的方法

更新: 澄清一下,问题是 "what is the proper way to test for the presence of a string of one or more characters at a given index in another string"。如果我使用了错误的术语,请原谅我。

原题

没有规范或正确的方法。 Multi-character 常量一直是实现定义的。查看编写代码时使用的编译器的文档,弄清楚它的意思。

更新问题

您可以使用 strchr() 匹配多个字符。

while (strchr( " ,", line_buf[++line_idx] ))
{

同样,这不考虑 multi-char 常量。在简单地删除它之前,你应该弄清楚为什么它在那里。

此外,strchr() 不处理 Unicode。例如,如果您正在处理 UTF-8 流,您将需要一个能够处理它的函数。

最后,如果您关心速度,配置文件。在“while”条件下使用三个(或四个)单独的测试表达式,编译器可能会为您提供更好的结果。

也就是说,多次测试可能是最好的解决方案!

除此之外,我还闻到了一些粗鲁的索引:line_idx 的更新方式取决于周围的代码以正确启动循环。确保在更新内容时不会产生 off-by-one 错误。

祝你好运!

UPDATE: to clarify, the question is "what is the proper way to test for the presence of a string of one or more characters at a given index in another string". Forgive me if I am using the wrong terminology.

嗯,有很多方法,但标准方法是使用 strspn,其原型为:

size_t strspn(const char *s, const char *accept);

而且它很巧妙:

calculates the length (in bytes) of the initial segment of s 
which consists entirely of bytes in accept.

这允许您测试 "the presence of a string of one or more characters at a given index in another string" 并告诉您该字符串中有多少个字符按顺序匹配。

例如,如果您 另一个字符串 char s = "somestring"; 并且想知道它是否包含字母 r, s, t,例如 [=16] =] 从第 5 个字符开始,你可以测试:

size_t n;
if ((n = strspn (&s[4], accept)) > 0)
    printf ("matched %zu chars from '%s' at beginning of '%s'\n",
           n, accept, &s[4]);

要按顺序比较,可以使用strncmp (&s[4], accept, strlen (accept));。您也可以简单地使用嵌套循环来迭代 saccept.

中的字符

所有方法都是"proper",只要它们不调用未定义的行为(并且合理有效).