为什么这个fgets()以奇怪的方式表现?

时间:2015-11-09 17:55:16

标签: c

我正在使用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
  

输出:找到了!

为什么会这样?

2 个答案:

答案 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