关于scanf,如图

qq_36684063 2017-10-31 03:29:43
不懂为什么会这样
...全文
224 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-11-02
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
codedoctor 2017-11-01
  • 打赏
  • 举报
回复
%c会监测一切字符,包括空格,而%d只检测数字字符的输入,而直接抛弃了前面的字符,所以就是这样了。
零隐 2017-10-31
  • 打赏
  • 举报
回复
你代码太简单,达不到你预期。 你得构思比较好的代码,以防出现意外。
qq_36684063 2017-10-31
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
#include <stdio.h>

int main(void)
{
    int a, b;
    char c;

    scanf("%d %c %d", &a, &c, &b);

    switch (c) {
        case '+':
            printf("%d %c %d = %d\n", a, c, b, a+b);
            break;

        case '-':
            printf("%d %c %d = %d\n", a, c, b, a-b);
            break;

        case '*':
            printf("%d %c %d = %d\n", a, c, b, a*b);
            break;

        case '/':
            if (b != 0)
                printf("%d %c %d = %d\n", a, c, b, a/b);
            else
                printf("b== 0\n");
            break;

        case '%':
            if (b != 0)
                printf("%d %c %d = %d\n", a, c, b, a%b);
            else
                printf("b== 0\n");
            break;
    }

    return 0;
}
上一个回帖有bug,改一下,%运算,除数也不能为0
为什么第二张图b会被2赋值 第三张b却是随机数
赵4老师 2017-10-31
  • 打赏
  • 举报
回复
判断输入合法性这个问题可以保证程序员100年不失业。 仅供参考:
#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
    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;
        } else if (0==k) {
            printf("skip char[%c]\n",p[0]);
            p++;
        } else {//EOF==k
            break;
        }
    }
    printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//skip char[ ]
//k,v,n=0,123,3
//skip char[a]
//k,v,n=0,123,3
//skip char[b]
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.
qq_36220735 2017-10-31
  • 打赏
  • 举报
回复
空格的问题 楼上正解
CT8100 2017-10-31
  • 打赏
  • 举报
回复
scanf("%d%c%d",&a,&c,&b);改成 scanf("%d空格%c%d",&a,&c,&b); 如果%c前面不加空格,是没有办屏蔽空格符的
自信男孩 2017-10-31
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
    int a, b;
    char c;

    scanf("%d %c %d", &a, &c, &b);

    switch (c) {
        case '+':
            printf("%d %c %d = %d\n", a, c, b, a+b);
            break;

        case '-':
            printf("%d %c %d = %d\n", a, c, b, a-b);
            break;

        case '*':
            printf("%d %c %d = %d\n", a, c, b, a*b);
            break;

        case '/':
            if (b != 0)
                printf("%d %c %d = %d\n", a, c, b, a/b);
            else
                printf("b== 0\n");
            break;

        case '%':
            if (b != 0)
                printf("%d %c %d = %d\n", a, c, b, a%b);
            else
                printf("b== 0\n");
            break;
    }

    return 0;
}
上一个回帖有bug,改一下,%运算,除数也不能为0
自信男孩 2017-10-31
  • 打赏
  • 举报
回复
输入第一个数之后,后面的输入任何字符都会赋值给c;因为%c是接收一个字符,那么这个字符可以是回车,空格等; 如果想符合你的格式,可以用下面的:
#include <stdio.h>

int main(void)
{
    int a, b;
    char c;

    scanf("%d %c %d", &a, &c, &b);

    switch (c) {
        case '+':
            printf("%d %c %d = %d\n", a, c, b, a+b);
            break;

        case '-':
            printf("%d %c %d = %d\n", a, c, b, a-b);
            break;

        case '*':
            printf("%d %c %d = %d\n", a, c, b, a*b);
            break;

        case '/':
            if (b != 0)
                printf("%d %c %d = %d\n", a, c, b, a/b);
            else
                printf("b== 0\n");
            break;

        case '%':
                printf("%d %c %d = %d\n", a, c, b, a%b);
            break;
    }

    return 0;
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧