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

标签 c string substring fgets

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

如果我有以下内容

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

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

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

最佳答案

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

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

有多种可能合适的替代方案。明显需要考虑的是 strchr()strrchr()strpbrk()strspn()strcspn():这些都不会修改它们分析的字符串。所有这些都是标准 C 的一部分(strtok() 也是如此),因此它们基本上随处可用。在单个字符之前查找 Material 建议您应该使用 strchr()

关于c - 读取用户输入并检查字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981935/

相关文章:

java - java 分割字符串

java - endIndex 小于此 String 对象子字符串的长度

python - 如何使用 Python 中的正则表达式从预定义的子字符串列表中替换或更新 DataFrame 的字符串实例

c - C 中的命名共享内存问题

c - 使用 fbo 和纹理的离屏渲染得到黑屏

Java - 如何将字符串中的字母转换为数字?

regex - 使用 awk 进行字符串匹配

c - 为什么在连接字符串时会出现段错误?

c - Windows 7 x64 上的 tmpfile()

arrays - 使用 R 查找数组中的特定字符串