如何在 C 中检查读取的字符串中的子字符串?
如果我有以下
char name[21];
fgets(name, 21, stdin);
如何检查字符串中的一系列子字符串?
如何在字符之前检查子字符串?例如,如何在=
符号之前检查子字符串?
警惕strtok()
; 它不是可重入的。除其他外,这意味着如果您需要在一个函数中调用它,然后调用另一个函数,并且如果另一个函数也使用strtok()
,那么您的第一个函数就搞砸了。它还'\0'
在分隔符上写入 NUL ( ) 字节,因此它会随时修改输入字符串。如果您要查找多个终止符,则无法确定找到了哪一个。此外,如果您编写了一个库函数供他人使用,但您的函数使用strtok()
,您必须记录这一事实,以便函数的调用者不会strtok()
因调用您的函数后使用的他们自己的代码的失败而感到困惑。换句话说,它是有毒的;如果你的函数调用strtok()
,一般来说,它会使您的函数无法重用;同样,您使用的代码strtok()
不能调用也使用它的其他人的函数。
strtok_r()
如果你仍然喜欢这个功能的想法——有些人喜欢(但我几乎总是避免它)——然后在你的系统上寻找。它是可重入的;它需要一个额外的参数,这意味着其他功能可以使用strtok_r()
(或strtok()
)而不影响您的功能。
有多种选择可能是合适的。要考虑的显而易见的是strchr()
, strrchr()
, strpbrk()
, strspn()
, strcspn()
:这些都不会修改它们分析的字符串。它们都是标准 C 的一部分(原样strtok()
),因此它们基本上随处可用。在单个字符之前寻找材料建议您应该使用strchr()
.
您可以使用strtok
,但它不是可重入的,它会破坏原始字符串。要研究的其他(也许更安全的)函数是strchr
、strstr
、strspn
,也许还有mem*
变体。一般来说,我避免strn*
使用变体,因为虽然它们进行“绑定检查”,但它们仍然依赖于 nul 终止符。它们可能会在恰好比您预期处理的更长的有效字符串上失败,并且除非您知道缓冲区大小,否则它们实际上不会阻止缓冲区溢出。最好(恕我直言)忽略终止符,并确切地知道每次mem*
函数工作方式时您正在使用多少数据。
使用strtok()将字符串拆分为标记。
char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
printf ("Substring: %s\n",pch);
}
您可以在 . 之后继续调用strtok()
以查找更多字符串=
。