这个为什么重置了还是死循环

天之骄子呃 2014-06-22 02:23:52
目的是想不断输入数据并判断 如果不是float就提示一下然后继续输入 但是这个输错(比如英文字符)之后一直输出"please enter correct format!" 郁闷
float score;

while(1)
{
cout<<"input score:"<<endl;
while ( cin>>score)
{
if(score>=89) cout<<score<<"good!"<<endl;
if(score<60) cout<<score<<"fail!"<<endl;
}

if(!cin)
{
cout<<"please enter correct format!"<<endl;
cin.clear();
}
}
...全文
112 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
天之骄子呃 2014-06-23
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
cin.clear(); cin.sync();
老师 这个我在vc6 和 codeblocks试了试都能正常运行 在cygwin下还是死循环
赵4老师 2014-06-23
  • 打赏
  • 举报
回复
cin.clear(); cin.sync();
天之骄子呃 2014-06-23
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 u014402634 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] cin.clear(); cin.sync();
老师 这个我在vc6 和 codeblocks试了试都能正常运行 在cygwin下还是死循环[/quote] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
#include <stdio.h>
int main() {
    int IP[4];
    int i;
    char c;

    printf("请输入一个ip地址:");fflush(stdout);
    while (1) {
        rewind(stdin);
        if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {
            if (0<=IP[0] && IP[0]<=255
             && 0<=IP[1] && IP[1]<=255
             && 0<=IP[2] && IP[2]<=255
             && 0<=IP[3] && IP[3]<=255
             && '\n'==c) {
                break;
            } else printf("输入的ip地址格式不对!\n请重新输入:\n");
        } else printf("输入的ip地址格式不对!\n请重新输入:\n");
    }
    for (i=0;i<4;i++) {
        printf("IP[%d]=%d\n",i,IP[i]);
    }
    return 0;
}

#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.
[/quote] 谢谢老师啦
赵4老师 2014-06-23
  • 打赏
  • 举报
回复
引用 8 楼 u014402634 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] cin.clear(); cin.sync();
老师 这个我在vc6 和 codeblocks试了试都能正常运行 在cygwin下还是死循环[/quote] 乍看起来c++的cin、cout在输入、输出上比c的scanf、printf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout! 使用scanf、printf。
#include <stdio.h>
int main() {
    int IP[4];
    int i;
    char c;

    printf("请输入一个ip地址:");fflush(stdout);
    while (1) {
        rewind(stdin);
        if (5==scanf("%d.%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&IP[3],&c)) {
            if (0<=IP[0] && IP[0]<=255
             && 0<=IP[1] && IP[1]<=255
             && 0<=IP[2] && IP[2]<=255
             && 0<=IP[3] && IP[3]<=255
             && '\n'==c) {
                break;
            } else printf("输入的ip地址格式不对!\n请重新输入:\n");
        } else printf("输入的ip地址格式不对!\n请重新输入:\n");
    }
    for (i=0;i<4;i++) {
        printf("IP[%d]=%d\n",i,IP[i]);
    }
    return 0;
}

#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.
The_Third_Wave 2014-06-22
  • 打赏
  • 举报
回复
引用 5 楼 u014402634 的回复:
[quote=引用 2 楼 u013171165 的回复:] 要清楚缓存啊!!!
vc6正常了 但cygwin64 还是死循环[/quote]
引用 5 楼 u014402634 的回复:
[quote=引用 2 楼 u013171165 的回复:] 要清楚缓存啊!!!
vc6正常了 但cygwin64 还是死循环[/quote]这个我解决不了。。。我用的不是这个
天之骄子呃 2014-06-22
  • 打赏
  • 举报
回复
引用 2 楼 u013171165 的回复:
要清楚缓存啊!!!
vc6正常了 但cygwin64 还是死循环
The_Third_Wave 2014-06-22
  • 打赏
  • 举报
回复
引用 3 楼 u014402634 的回复:
[quote=引用 1 楼 u013171165 的回复:]
std::cin.clear();
		std::cin.sync();
就可以了
高手 还是不行啊 [/quote] cin.sync();怎么可能不行?这错误太常见了。还有我不是高手。
天之骄子呃 2014-06-22
  • 打赏
  • 举报
回复
引用 1 楼 u013171165 的回复:
std::cin.clear();
		std::cin.sync();
就可以了
高手 还是不行啊
The_Third_Wave 2014-06-22
  • 打赏
  • 举报
回复
要清楚缓存啊!!!
The_Third_Wave 2014-06-22
  • 打赏
  • 举报
回复
std::cin.clear();
		std::cin.sync();
就可以了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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