标题:有详细了解我遇到的问题吗?麻烦讲解一下,谢哈。
只看楼主
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
已结贴  问题点数:20 回复次数:12 
有详细了解我遇到的问题吗?麻烦讲解一下,谢哈。
大家看看代码有错误吗?如果没有,能尝试一下以下输入:
2 回车 a 空格 1 空格 2 回车 b 空格 3 空格 4 回车
然后问题就出现了,但为何会有多出空字符的问题的呢?
有解困或的请来指正,谢谢!!
程序代码:
#include <stdio.h>

int main(int argc, char **argv)
{
    int b , c , n , i ;
    char a;
    scanf("%d",&n);
    for(i = 0 ; i < n ; i++){
        scanf("%c %d %d",&a,&b,&c);
        printf("%c %d %d\n",a,b,c);
    }
    return 0;
}

搜索更多相关主题的帖子: 讲解 回车 空格 int char 
2018-01-16 16:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:10 
scanf的%c格式会读入空白符('\n'、'\t'、' '等)在%c前加个空格试试。
#include <stdio.h>
int main(int argc, char **argv)
{
    int b , c , n , i ;
    char a;
    scanf("%d",&n);
    for(i = 0 ; i < n ; i++)
    {
        scanf(" %c%d%d",&a,&b,&c);
        printf("%c %d %d\n",a,b,c);
    }
    return 0;
}
2018-01-16 16:42
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
回复 2楼 吹水佬
问题是空白符哪里来?
按照代码来阅读,没有发现问题的出处。

其实把那个a类型改回%d,问题就消失了,但为何用%c就出问题了呢?

[此贴子已经被作者于2018-1-16 16:56编辑过]

2018-01-16 16:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
执行scanf时是以'\n'结束,也是空白符,下次scanf(%c)时这个'\n'会被读入a
2018-01-16 16:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
可以这样看看:
    scanf("%d",&n);
    scanf("%c",&a);
    printf("%d %c\n",a,a);
2018-01-16 17:02
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
回复 5楼 吹水佬
但按照scanf保留空白符没读走的说法,以下代码却是正确的(唯一区别就是把a的char类型改回int类型,那个多出的空白字符就消失了)
所以困惑我的是为啥int处理没产生空白符而char的读会出现读漏的空白符。
程序代码:
#include <stdio.h>
int main(int argc, char **argv)
{
    int a , b , c , n , i ;
//    char a;
    scanf("%d",&n);
    for(i = 0 ; i < n ; i++){
        scanf("%d %d %d",&a,&b,&c);
        printf("%d %d %d\n",a,b,c);
    }
    return 0;
}


[此贴子已经被作者于2018-1-16 17:12编辑过]

2018-01-16 17:09
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
得分:10 
这个空白是第1次scanf留下的,你在第1个scanf后面加个getchar()就能解决了
2018-01-16 17:33
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
得分:0 
这样子
2018-01-16 17:35
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
得分:0 
scanf会把'\n'之前的值取走,留下'\n'在缓冲区里,你再一次scanf时会先读入这个'\n'并加上你第2次输入的数据。所以printf时会出错。这跟另一个输入函数fscanf不一样,fscanf会把'\n'也一起取走,当作字符串比较时会惹大麻烦的。
2018-01-16 17:41
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
得分:0 
回复 8楼 虫眼
按照你的说的修改了一下程序:

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

int main(int argc, char **argv)
{
    int a , b , c , n , i ;
//    char a;
    scanf("%d",&n);
    printf("%d\n",getchar());
    for(i = 0 ; i < n ; i++){
        scanf("%d %d %d",&a,&b,&c);
        printf("%d\n",getchar()); //这里尝试看看有否输出相同的10,结果是有的,但循环到第二部的scanf却不受这个保留的空白符干扰,能正常读取,为啥呢?
        printf("%d %d %d\n",a,b,c);
    }
    return 0;
}
2018-01-16 17:56



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




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

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