Annette_wang 2021-03-11 17:32 采纳率: 91.7%
浏览 33
已采纳

程序在输入n值及n个数,还能输入值,直到回车才计算,程序是写错了?

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    long long n,i,max,min,c;
    cin>>n;
   int a[n];
    for(i=0;i<n;i++)
    {
        cin>>a[i];
        if(i==0) max=min=a[i];
        if(a[i]>max) max=a[i];
        if(a[i]<min) min=a[i];


    }
    c=max-min;
cout<<c;

return 0;}

最大跨度问题,输入n值,n个数,求最大数减最小数问题

  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-03-11 18:46
    关注

    变量指定数组长度的语法叫做VLA,但是绝大多数工程师都会告诉你,避免使用VLA。这是因为VLA的实际实现没有规范背书,没有安全性、健壮性、稳定性、可移植性,行为也不可能做到完善的预测(一个动态分配空间的操作,是必然有可能出错的,但就我所知VLA没有任何标准的错误处理逻辑),一旦出了问题,调试和解决都会非常困难。总之,用VLA绝对是个坏习惯。(顺带一提,我用我的MSVC编译你的代码,报了编译错误。这进一步说明,微软那里的一些工程师们同样不认为VLA是什么值得使用的东西。)如果必须要根据输入决定长度,请使用STL容器,或者自己封装一个类也行,用malloc也行。这些方案都比VLA更加安全,尽管代码量稍微多一些。

    此外,你这个代码风格实在是太糟糕了,这么不规范的代码,面试官很可能把你直接pass掉。编辑器一般有tab转空格功能,善用tab而不要狂按空格(在Makefile中不要把tab变成空格)。

    ==============================================

    回到正题。已经输入一定数据仍能继续输入,需要换行才能继续输入,是非常正常的现象。这是因为控制台默认是行缓冲(line buffered),读取时是一行一行读取的,你不按回车,进程是无法获取控制台输入的值的。这点可以改变,但是非常麻烦,涉及操作系统API,而且这些方案通常没有可移植性。如果一定要进程实时从键盘获取任何东西,就不能使用scanf、fread这类C库函数,而要使用操作系统的键盘API,或者你也可以把控制台设置到raw模式(一般的模式是canonical模式,区别在于这个模式是行缓冲,识别SIGINT,raw模式可以是无缓冲),然后用操作系统底层API来从stdin获取数据。这个过程涉及大量资料查阅,而且Windows和Linux的API完全不同,不能通用。就我所知,要实现控制台实时读入,没有更简单的方法。

    我的建议:接受这种行缓冲现象就好,这是正常的现象。而且,行缓冲一般会比无缓冲快一点,就你的需求而言,也完全没有必要给控制台实现无缓冲。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序