| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 805 人关注过本帖
标题:fgets()读取\n的问题发现
只看楼主 加入收藏
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:13 
fgets()读取\n的问题发现
fgets()函数会读取\n,把\n放到字符串里去,但是我发现也可以不让它把\n放进去

程序代码:
# include <stdio.h>

int main(void)
{
    
    char str[7];

    fgets(str,7,stdin);  //输入:12345,预留2个字符的空间,一个放\n,一个放\0 
    
    
    fputs(str,stdout);   //fputs本身没有换行效果,但是fgets读取了\n,输出后造成换行 
    
    return 0;
}


但如果我只预留1个字符的空间去放\0,发现\n就不会读取到字符串里面去,这样合适吗
搜索更多相关主题的帖子: 字符串 
2015-04-02 16:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
当然不合适。

授人以渔,不授人以鱼。
2015-04-02 16:10
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
了解。

你醒了?快起来敲代码!!
2015-04-02 16:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你明白为什么了?

授人以渔,不授人以鱼。
2015-04-02 16:24
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
\n  被挤到了缓冲区里
下一个getchar()就会读取到\n
是吗?

你醒了?快起来敲代码!!
2015-04-02 16:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不是的。你再想清楚,不然写个测试程序验证一下自己的想法,会看到真实原因的。

授人以渔,不授人以鱼。
2015-04-02 16:38
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
程序代码:
# include<stdio.h>
int main(void)
{
    char str[7];
    char ch;
    fgets(str,7,stdin);
    
    ch=getchar();
    
    putchar(ch);
    putchar(ch);
    putchar(ch);
    putchar(ch);
    putchar(ch);
    return 0;
} 


这就是我写的测试程序,结果是输出了5个换行。。。
难道还有什么危险存在

你醒了?快起来敲代码!!
2015-04-02 16:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
测试肯定不是这么写啦。你定义的str[7],但你知道str实际上收到了多长?如果是2个字符的字符串呢?你再用你的输入方式,puts(str)看看,'\0'到哪里了?

授人以渔,不授人以鱼。
2015-04-02 16:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
解决这个问题最有效的办法,是找到'\0'之后把它挪到前面一位,即把它前面的那个字符也刷为'\0'。

授人以渔,不授人以鱼。
2015-04-02 16:52
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
貌似懂了,也就是要让str字符串有\0作为结束标志,不然puts会一直从str内存往后找\0,直到找到\0才会停止输出?

你醒了?快起来敲代码!!
2015-04-02 16:56
快速回复:fgets()读取\n的问题发现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025521 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved