开发者社区> 问答> 正文

关于fgets运行逻辑的问题(C语言)

代码实现目标:希望从键盘读入一串字符,在两串字符中搜索是否存在输入字符。

代码:

#include <stdio.h>
#include <string.h>
int main()
{
   const char haystack[][20] = {"TutorialsPoint","Lala town"};
   char needle[10];
   char *ret;
   fgets(needle, 10, stdin);
   //scanf("%9s",needle);
   printf("%s\n", needle);
   for(int i=0; i<2; i++)
   {
       ret = strstr(haystack[i], needle);
       printf("%p\n", ret);
       if(strstr(haystack[i], needle))
       printf("The substring is: %s\n", ret);
   }  
   return(0);
}

问题:

1.使用“fgets”从键盘读入一串字符,例如“town”,那么

 `if(strstr(haystack[i],   needle))` 将会判为null,从而
 `printf("The substring is: %s\n", ret);`将不会执行。
 

2.但是如果将 fgets(needle, 5, stdin);原来的“10”改为“5”,运行时输入“town”,就可以顺利输出结果:
screenshot
3.如果把fgets(needle, 10, stdin);行注释,换成下一行scanf("%9s",needle);就不存在上述问题,直接能输出strstr搜索后的结果。
不明白为什么fgets那么写就不行,我的猜测是:
fgets读入一整行,所以可能设置大小为10的时候在用“town”填满needle数组的前四位后,直接在最后一位填充了“0”,之间还有一些不明字符,所以不会match,当把大小改为5的时候,就变为“town0”所以不存在上述问题。不知道自己的猜测对不对。求大神点拨,谢谢。

展开
收起
杨冬芳 2016-05-27 15:28:14 1846 0
1 条回答
写回答
取消 提交回答
  • IT从业

    fgets取到的内容包括换行符
    并且应该养成良好的习惯,给予一段内存初始值。

    2019-07-17 19:18:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载