标题: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443432-1-1.html




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

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