如何在C中检查读取字符串中的子字符串?
如果我有以下
char name[21];
fgets(name, 21, stdin);
如何查看字符串中的一系列子字符串?
如何检查字符前的子字符串?例如,如何在=
符号之前检查子字符串?
答案 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
但它不可重入并且会破坏原始字符串。要查看的其他(可能更安全)函数可能是strchr
,strstr
,strspn
,也许还有mem*
变体。一般来说,我避免使用strn*
变体,因为虽然它们“进行检查”,但仍然依赖于nul终结符。它们可能会失败的有效字符串恰好比您预期的要长,并且它们实际上不会阻止缓冲区溢出,除非您知道缓冲区大小。更好(恕我直言)忽略终结者,并确切知道每次mem*
函数的工作方式时你使用了多少数据。