C++ cin如何输入回车停止

 水源水足 发布于 2022-11-03 14:14

Problem Description
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
Sample Input
0 0 0 1
0 1 1 0
Sample Output
1.00
1.41

这是我写的代码:

//输入两点坐标(X1, Y1), (X2, Y2), 计算并输出两点间的距离。
#include 
#include 
#include 
#include 


using namespace std;

int main(void)
{

    float px, py, qx, qy;

    while (cin >> px >> py >> qx >> qy)
    {
        int tmp = pow((px - qx), 2) + pow((py - qy), 2);
        double res = sqrt(tmp);
        cout << setiosflags(ios::fixed);
        cout << setprecision(2) << res << endl;
    }
    

    return 0;
}

程序应该是这样的:输入一行,按回车显示结果。如果这时再按回车,程序就结束。(误)
问题就是不知道怎么停止输入,只能按ctrl+z或者输入非法字符。
请问在C++里如何实现?不用C

这是通过的C语言代码

#include 
#include 
 
int main(){
    double x1;
    double y1;
    double x2;
    double y2;
    double result;
     
    while((scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))!=EOF){
        result=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
        result=sqrt(result);
         
        printf("%.2lf\n",result);
    }
    return 0;
}

我发现按回车也没用,现在我也不清楚机器判断通过的条件是什么。
有人能分析下为什么我的不能通过而上面的这个能够通过呢?

2 个回答
  • F6 也可以退出。

    cin是标准输入流对象,
    输入任意非数字字符,流读取失败,就会标记错误,返回false.
    F6可跳出循环,是因为它表示eof(文件结束符)。

    ctrl+z 是直接终止程序进程。

    2022-11-05 14:04 回答
  • 这种算法题目一般都是无限的接受输入,不要求结束的,除非是明确的要求对于什么输入程序要结束
    首先来说你的代码

    //输入两点坐标(X1, Y1), (X2, Y2), 计算并输出两点间的距离。
    #include <iostream>
    #include <cmath>
    #include <vector>
    #include <iomanip>
    
    
    using namespace std;
    
    int main(void)
    {
        float px, py, qx, qy;
    
        while (cin >> px >> py >> qx >> qy)  
        //cin 输入是类型安全的,不会把一个字母当作数字读进来,
        //当你输入错误或者达到EOF时,bool(cin)就是false了,所以循环退出
        {
            // 这里的int类型丢失了精度,是你错误的原因,自己检讨
            int tmp = pow((px - qx), 2) + pow((py - qy), 2); 
            double res = sqrt(tmp);
            cout << setiosflags(ios::fixed);
            cout << setprecision(2) << res << endl;
        }
        
        return 0;
    }

    然后。。

    // 其实这句用处相当相当小,scanf的返回值是成功输入的数字个数 EOF的一般定义值是0
    while((scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))!=EOF){ 
            result=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
            result=sqrt(result);
             
            printf("%.2lf\n",result);
        }
    2022-11-05 14:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有