如何在读入字符串中检查C语言中的子字符串?
如果我有以下内容
char name[21];
fgets(name, 21, stdin);如何检查字符串中的一系列子字符串?
如何检查字符之前的子字符串?例如,如何检查=符号之前的子字符串?
发布于 2011-02-13 10:58:23
这意味着如果你需要在一个函数中调用它,然后再调用另一个函数,如果那个函数也使用了strtok(),那么你的第一个函数就会变得一团糟。它还在分隔符上写入NUL ('\0')字节,因此它会在执行过程中修改输入字符串。如果要查找多个终止符,则无法分辨找到的是哪一个。此外,如果您编写了一个库函数以供他人使用,但您的函数使用了strtok(),则必须记录这一事实,以便函数的调用者不会被调用您的函数后使用strtok()的自己的代码的失败所困扰。换句话说,它是有害的;如果您的函数调用strtok(),通常会使您的函数无法重用;类似地,使用strtok()的代码不能调用也使用它的其他人的函数。
如果你仍然喜欢这个功能的想法-有些人喜欢(但我几乎总是回避它)-那么在你的系统上寻找strtok_r()。它是可重入的;它接受一个额外的参数,这意味着其他函数可以使用strtok_r() (或strtok()),而不会影响您的函数。
要考虑的最明显的是strchr()、strrchr()、strpbrk()、strspn()、strcspn():这些都不会修改它们分析的字符串。
发布于 2011-02-13 09:56:49
使用strtok()将字符串拆分为标记。
char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
printf ("Substring: %s\n",pch);
}您可以在=之后继续调用strtok()来查找更多字符串。
发布于 2011-02-13 11:02:44
您可以使用strtok,但它不是可重入的,它会破坏原始字符串。可以研究的其他函数(可能更安全)是strchr、strstr、strspn,也许还有mem*的变体。通常,我避免使用strn*变体,因为虽然它们执行"boinds检查“,但它们仍然依赖于nul终止符。它们可能会在一个恰好比您期望处理的字符串更长的有效字符串上失败,并且除非您知道缓冲区的大小,否则它们实际上不会防止缓冲区溢出。更好的做法是忽略终止符,并准确地知道每次mem*函数的工作方式都在处理多少数据。
https://stackoverflow.com/questions/4981935
复制相似问题