2

如何在 C 中检查读取的字符串中的子字符串?

如果我有以下

char name[21];
fgets(name, 21, stdin);

如何检查字符串中的一系列子字符串?

如何在字符之前检查子字符串?例如,如何在=符号之前检查子字符串?

4

3 回答 3

2

警惕strtok(); 它不是可重入的。除其他外,这意味着如果您需要在一个函数中调用它,然后调用另一个函数,并且如果另一个函数也使用strtok(),那么您的第一个函数就搞砸了。它还'\0'在分隔符上写入 NUL ( ) 字节,因此它会随时修改输入字符串。如果您要查找多个终止符,则无法确定找到了哪一个。此外,如果您编写了一个库函数供他人使用,但您的函数使用strtok(),您必须记录这一事实,以便函数的调用者不会strtok()因调用您的函数后使用的他们自己的代码的失败而感到困惑。换句话说,它是有毒的;如果你的函数调用strtok(),一般来说,它会使您的函数无法重用;同样,您使用的代码strtok()不能调用也使用它的其他人的函数。

strtok_r()如果你仍然喜欢这个功能的想法——有些人喜欢(但我几乎总是避免它)——然后在你的系统上寻找。它是可重入的;它需要一个额外的参数,这意味着其他功能可以使用strtok_r()(或strtok())而不影响您的功能。

有多种选择可能是合适的。要考虑的显而易见的是strchr(), strrchr(), strpbrk(), strspn(), strcspn():这些都不会修改它们分析的字符串。它们都是标准 C 的一部分(原样strtok()),因此它们基本上随处可用。在单个字符之前寻找材料建议您应该使用strchr().

于 2011-02-13T02:58:22.857 回答
1

您可以使用strtok,但它不是可重入的,它会破坏原始字符串。要研究的其他(也许更安全的)函数是strchrstrstrstrspn,也许还有mem*变体。一般来说,我避免strn*使用变体,因为虽然它们进行“绑定检查”,但它们仍然依赖于 nul 终止符。它们可能会在恰好比您预期处理的更长的有效字符串上失败,并且除非您知道缓冲区大小,否则它们实际上不会阻止缓冲区溢出。最好(恕我直言)忽略终止符,并确切地知道每次mem*函数工作方式时您正在使用多少数据。

于 2011-02-13T03:02:43.540 回答
1

使用strtok()将字符串拆分为标记。

char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
  printf ("Substring: %s\n",pch);
}

您可以在 . 之后继续调用strtok()以查找更多字符串=

于 2011-02-13T01:56:48.707 回答