这是我在一个非常旧的C库中发现的一些代码,该代码试图从文件中吃掉空格...
while(
(line_buf[++line_idx] != ' ') &&
(line_buf[ line_idx] != ' ') &&
(line_buf[ line_idx] != ',') &&
(line_buf[ line_idx] != ' ') )
{
这个伟大的线程解释了问题是什么,但是大多数答案是"只是忽略它"或"您永远不应该这样做"。但是,我看不到的是规范解决方案。谁能使用"正确的方式"提供一种方法来编码此测试?
更新:要澄清,问题是"测试在另一个字符串中给定索引上存在一个或多个字符串的字符串的正确方法"。如果我使用错误的术语,请原谅我。
原始问题
没有规范或正确的方式。多字符常数始终已定义。查找编写代码时使用的编译器的文档并弄清楚是什么意思。
更新的问题
您可以使用strchr((。
匹配多个字符while (strchr( " ,", line_buf[++line_idx] ))
{
再次,这不会解释该多键常数。您应该弄清楚为什么在删除它之前就在那里。
另外,strchr((不处理unicode。例如,如果您要处理UTF-8流,则需要一个能够处理它的函数。
最后,如果您担心速度, profile 。编译器可能会在" Wile"条件下使用三个(或四个(单独的测试表达式为您提供更好的结果。
换句话说,多个测试可能是最好的解决方案!
除此之外,我闻到了一些无情的索引:更新line_idx
的方式取决于周围的代码,以正确地启动循环。更新内容时,请确保您不会造成一个错误的错误。
祝你好运!
更新:要澄清,问题是"测试的正确方法是什么 在给定的一个或多个字符串的情况下 另一个字符串中的索引"。如果我使用错误的话,请原谅我 术语。
好吧,有多种方法,但是标准方法是使用具有原型的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.
这使您可以测试"在另一个字符串中给定索引上的一个或多个字符串的存在"。
例如,如果您有另一个字符串说 char s = "somestring";
并想知道它是否包含字母 r, s, t
,例如,在第5个字符开始的 char *accept = "rst";
中,您可以测试:
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));
。您也可以简单地使用nestest循环通过accept
中的字符在s
上迭代。
只要它们不调用未定义的行为(并且效率合理(。