读取用户输入并检查字符串

时间:2011-02-13 01:52:19

标签: c string substring fgets

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

如果我有以下

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

有许多替代方案可能是合适的。需要考虑的是strchr()strrchr()strpbrk()strspn()strcspn():这些都不会修改他们分析的字符串。所有这些都是标准C的一部分(因为strtok()),因此它们基本上可以在任何地方使用。在单个字符之前查找材料表明您应该使用strchr()

答案 1 :(得分:1)

使用strtok()将字符串拆分为令牌。

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

您可以继续致电strtok(),以便在=之后找到更多字符串。

答案 2 :(得分:1)

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