我正在使用strstr()函数搜索用户在其他字符串中给出的字符串。
问题是,当我使用fgets()来获取输入时,即使用户输入的字符串存在,strstr()函数也会给出零(false)。
例如:
char search[20]; //MAX size of search term is 20 bytes
puts("Enter search term: ");
fgets(search,20,stdin); //suppose user enters: photographer (12 characters long)
if(strstr("I'm no photographer but I can picture us together",search))
puts("Found!");
else
puts("No luck!");
输出:没有运气!
字符串中还有坚韧的“摄影师”
但是,如果我使用scanf()来搜索输入。
scanf("%19s",search); //like this
输出:找到了!
为什么会这样?
答案 0 :(得分:1)
来自手册:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。 如果读取换行符,则会将其存储到缓冲区 r中。终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。
请注意,这些功能都不能安全使用,因为它们不会检查缓冲区的大小。答案 1 :(得分:1)
这种情况正在发生,因为public async Task Invoke(HttpContext httpContext, ValueStore valueStore)
{
await httpContext.Response.WriteAsync($"Random value = {valueStore.SomeValue}");
await _next(httpContext);
}
在字符串读取结束时存储了一个trailin换行符fgets()
。因此,您在\n
中阅读的字符串基本上是search
使用"photographer\n"
或在换行符上覆盖空字符scanf()
。
要覆盖换行符,您可以执行以下操作
\0