scanf能从中间提前跳出等待输入吗(不在循环中)

CarreLiu 2018-03-18 11:16:31
我需要输入一个有理数,有可能是分数、小数或者整数。现在我打算用scanf做,具体如下代码。a为分子或者整数部分,b为分母或者小数部分。但问题是如果输入的只有整数(例如5),假设之后不会再输入数了,那么scanf中的c和b将一直处于等待输入状态。我想知道有什么办法能提前结束scanf的等待输入状态,继续下一步吗。如果不可以,麻烦给出可行的方案。我需要将分子和分母(整数和小数)单独储存,但一定要考虑只有整数的情况。谢谢啦!很急!
#include <stdio.h>

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

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

return 0;
}
...全文
513 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-20
  • 打赏
  • 举报
回复
仅供参考:
#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.
赵4老师 2018-03-19
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 在每个最后不带\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字符或回车换行,读取下一个字符。
qq_41708727 2018-03-19
  • 打赏
  • 举报
回复
我的思路是用字符串输入后期判断然后去掉小数点 个人的建议是不用转换整数,直接字符输出 萌新一枚,求大佬指点
qq_41708727 2018-03-19
  • 打赏
  • 举报
回复
#include<stdio.h> #include<string.h> #include<math.h> int main(){ char a[1000]; int z=0,x=0,i,k = 0; scanf("%s",&a); for(i = 0; i < strlen(a); i ++ ){//判断是否有小数点 if(a[i] == '.') break; } if(i == strlen(a)){//是整数 for(int j=strlen(a)-1;j>=0;j--){ z+=((int)a[k]-48)*((int)pow(10,j)); k++; } printf("%d",z); } else{//是小数 k=i+1;//小数点是第i位,从第i+1位开始是小数 for(int j=strlen(a)-1;j>i;j--){ x+=((int)a[k]-48)*((int)pow(10,j-i-1));//幂次减去第一位 k++; } k = 0; for(int j=i-1;j>=0;j--){ z+=((int)a[k]-48)*((int)pow(10,j)); k++; } printf("%d.%d",z,x); } return 0; } /* #include<stdio.h> #include<string.h> #include<math.h> int main(){ char a[100]; scanf("%s",a); int i,m=0,k=0; for(i=strlen(a)-1;i>=0;i--){ m+=((int)a[k]-48)*((int)pow(10,i)); k++; } printf("%d",m) ; return 0; } 我写的一个字符串变整数的程序,供参考 */

69,373

社区成员

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

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