C语言中关于getchar()的问题

[复制链接]
查看11 | 回复6 | 2021-1-27 05:27:05 | 显示全部楼层 |阅读模式
为何当y为int类型时scanf()后面要加两个getchar()才行,要是不加getchar()的话,后面的data的值就会等于y;加一个getchar()的话,data的值为\n;
当y为char类型时scanf()后面要加一个getchar()才行,要是不加getchar()的话,后面的data的值就会等于\n;
#include
#defineM3
intmain()
{
chara[M];
chardata;
inti,y;
intj=0;
printf("请输入:");
for(i=0;i -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
scanf("%d",&y);后边不跟//getchar();就会发生段错误.
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
只需一个就可以把,getchar()是为了吃掉scanf()留下的换行符啊........
回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
因为printf("哈哈哈");改成
printf("哈哈哈\n");
scanf("%d",&y);
getchar();//用于接收键盘输入数字y之后的从键盘输入的回车符

回复

使用道具 举报

千问 | 2021-1-27 05:27:05 | 显示全部楼层
FormatSpecificationFields:scanfandwscanfFunctions
Aformatspecificationhasthefollowingform:
%
  • [width][{h|l|I64|L}]type
    Theformatargumentspecifiestheinterpretationoftheinputandcancontainoneormoreofthefollowing:
    White-spacecharacters:blank('');tab('\t');ornewline('\n').Awhite-spacecharactercausesscanftoread,butnotstore,allconsecutivewhite-spacecharactersintheinputuptothenextnon–white-spacecharacter.Onewhite-spacecharacterintheformatmatchesanynumber(including0)andcombinationofwhite-spacecharactersintheinput.

    Non–white-spacecharacters,exceptforthepercentsign(%).Anon–white-spacecharactercausesscanftoread,butnotstore,amatchingnon–white-spacecharacter.Ifthenextcharacterinstdindoesnotmatch,scanfterminates.

    Formatspecifications,introducedbythepercentsign(%).Aformatspecificationcausesscanftoreadandconvertcharactersintheinputintovaluesofaspecifiedtype.Thevalueisassignedtoanargumentintheargumentlist.
    Theformatisreadfromlefttoright.Charactersoutsideformatspecificationsareexpectedtomatchthesequenceofcharactersinstdin;thematchingcharactersinstdinarescannedbutnotstored.Ifacharacterinstdinconflictswiththeformatspecification,scanfterminates,andthecharacterisleftinstdinasifithadnotbeenread.

  • 回复

    使用道具 举报

    千问 | 2021-1-27 05:27:05 | 显示全部楼层
    仅供参考:#include
    intmain()
    {
    inta,b,n,v,r,k;
    charbuf[80];
    char*p;
    k=0;
    r=EOF;
    while(1){
    if(EOF==r){
    fgets(buf,80,stdin);
    p=buf;
    }
    while(1){
    r=sscanf(p,"%d%n",&v,&n);
    if(1==r){k++;break;}
    if(EOF==r)break;
    p++;
    }
    if(EOF==r)continue;
    p+=n;
    if(1==k)a=v;
    if(2==k){
    b=v;
    break;
    }
    }
    printf("%d,%d\n",a,b);
    return0;
    }
    #include
    chars[]="123ab4";
    char*p;
    intv,n,k;
    voidmain(){
    p=s;
    while(1){
    k=sscanf(p,"%d%n",&v,&n);
    printf("k,v,n=%d,%d,%d\n",k,v,n);
    if(1==k){
    p+=n;
    }elseif(0==k){
    printf("skipchar[%c]\n",p[0]);
    p++;
    }else{//EOF==k
    break;
    }
    }
    printf("End.\n");
    }
    //k,v,n=1,123,3
    //k,v,n=0,123,3
    //skipchar[]
    //k,v,n=0,123,3
    //skipchar[a]
    //k,v,n=0,123,3
    //skipchar
    //k,v,n=1,4,2
    //k,v,n=-1,4,2
    //End.

    回复

    使用道具 举报

    千问 | 2021-1-27 05:27:05 | 显示全部楼层
    在每个最后不带\n的printf后面加fflush(stdout);
    在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
    另外请检查scanf的返回值。
    //请今后要用
    charc;
    scanf("%c",&c);
    //时,都改为
    chars[2];
    charc;
    scanf("%1s",s);
    c=s[0];
    //自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    主题

    0

    回帖

    4882万

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    48824836
    热门排行