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

C 读取用户输入并检查字符串,c,string,substring,fgets,C,String,Substring,Fgets,如何在C中检查子字符串的读入字符串 如果我有以下几点 char name[21]; fgets(name, 21, stdin); 如何检查字符串中的一系列子字符串 如何在字符之前检查子字符串?例如,如何在=符号之前检查子字符串?用于将字符串拆分为标记 char *pch; pch = strtok (name,"="); if (pch != NULL) { printf ("Substring: %s\n",pch); } 您可以继续调用strtok(),在=之后查找更多字符串,请小

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

如果我有以下几点

char name[21];
fgets(name, 21, stdin);
如何检查字符串中的一系列子字符串

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

用于将字符串拆分为标记

char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
  printf ("Substring: %s\n",pch);
}
您可以继续调用
strtok()
,在
=

之后查找更多字符串,请小心
strtok()
;它不是再进入者。除此之外,这意味着如果您需要在一个函数中调用它,然后调用另一个函数,并且如果另一个函数也使用了strtok(),那么您的第一个函数就会出错。它还通过分隔符写入NUL(
'\0'
)字节,因此它会在输入字符串时进行修改。如果您要查找多个终结者角色,则无法确定找到了哪一个。此外,如果您编写了一个库函数供其他人使用,但您的函数使用了
strtok()
,则必须记录这一事实,以便函数的调用者不会因为调用您的函数后自己使用
strtok()
的代码失败而感到困惑。换句话说,它是有毒的;如果您的函数调用strtok(),通常会使您的函数不可用;类似地,使用strtok()的代码不能调用其他也使用它的人的函数

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


可能有多种合适的替代方案。显然要考虑的是<代码> STRCH(<代码)>代码> STRRCR()/<代码>,代码> StrubRK()/<代码>,<代码> StrutNo()/<代码>,代码> STRSPN](<)/代码>:没有一个修改它们分析的字符串。所有这些都是标准C的一部分(正如strtok()),因此它们基本上在任何地方都可用。在单个字符之前查找材料建议您使用
strchr()

您可以使用
strtok
,但它不可重入,并且会破坏原始字符串。其他(可能更安全的)功能是
strchr
strstr
strspn
,可能还有
mem*
变体。通常,我避免使用
strn*
变体,因为虽然它们进行“boinds检查”,但它们仍然依赖nul终止符。它们可能会在一个恰好比您预期要处理的长度更长的有效字符串上失败,并且除非您知道缓冲区大小,否则它们实际上不会防止缓冲区溢出。最好(IMHO)忽略终止符,并准确地知道每次使用
mem*
函数时有多少数据。

谢谢。这将返回或打印什么?=之前的子字符串?如何将它与C中的另一个字符串进行比较?它是
=
之前的字符串。与的所有字符串比较都是使用C中的
strcmp()
(或类似
strncmp()
的变体)完成的,因此只需使用
pch
作为参数之一。发布一个示例输入字符串。如果strtok无法标记它,那么您可能需要逐个字符扫描并选择子字符串。我想要一个等价于Objective C Components SeparatedByString:的组件,它返回一个元素数组,以便您可以访问您想要的内容。+1用于击败我并同时使用更多单词。第三个
strtok
问题是我以前从未想到过的。@alJaree-你必须自己动手。它是否应该返回一个C数组(带有
size\u t*
out参数)?还是应该将缓冲区和长度作为参数并尝试填充它们?或者它应该返回一个用于数组目的的用户定义结构吗?类似地,它应该如何分配字符串?我要做的是拥有一个结构的集合。在这些结构中,我有变量,其中一个变量是字符串数组。所以我需要获取用户输入,通过将其分配给tempStruct字段来处理它。我想检查用户输入并匹配第一个“令牌”(在“:”之前),然后取其余的,将其存储在字符串数组中。重复此操作,直到输入的第一个标记与我想要的不匹配,然后将此结构添加到集合结构中。@alJaree:内存将如何分配?您如何知道输入行的长度?如果输入行比您想象的要长,会发生什么情况?你怎么知道第一个脚趾与你想要的不匹配?当你说“字符串数组”时,你是在分割冒号后面的内容吗?你需要在冒号前处理空格吗?在第一个字之前?在结肠之后?您是将具有相同前缀的多行匹配到同一临时结构,还是单独处理每一行?如果输入行中没有冒号会发生什么?C看起来很原始。我只想在大学里学。这种动态做事的斗争。我希望obj c更普遍一些。:/如果我不知道每次会收到多少数据呢。我正在拆分用户输入。e、 语言:英语我想检查语言,然后抓取英语并保存它。@alJaree-这是非常有意的。它可以让你更快更精确地做事。如果你想要简单的动态控制(这也是一件好事,也有它自己的优点),你不应该使用C。但是学习如何用“C方式”来实现它也很重要。当然。我知道知道知道事情是如何运作的很好。当计算机拥有几乎无限的内存和处理能力时,未来会发生什么?无论如何,这是另一个讨论;)因此,我应该手动扫描char数组(用户输入)并检查分隔符,将每个部分存储到一个数组中