zoukankan      html  css  js  c++  java
  • C++/CLI——使用嵌套 if 语句的 CLR 程序

    // 嵌套ifCLR.cpp: 主项目文件。
    
    #include "stdafx.h"
    
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
        wchar_t letter;
        Console::WriteLine(L"Enter a letter: ");
    
        letter = Console::Read();
        if(letter >= 'A')
            if(letter <= 'Z')
            {
                Console::WriteLine(L"You entered a captial letter.");
                return 0;
            }
        if(letter >= 'a')
            if(letter <= 'z')
            {
                Console::WriteLine(L"You entered a small letter.");
                return 0;
            }
        Console::WriteLine(L"You did not enter a letter.");
       
        return 0;
    }
    
    

    按照书上的代码,运行时窗口一闪就消失了

    可是在编写C++/CLI控制台应用程序时,发现即使使用了Console::ReadLine(); ,运行时窗口仍然消失了

    看到网上有人提出解决办法,我打算总结一下。

    首先解释一下关于缓冲区的内容。

    每个输入输出流都维护一个字符缓冲区,用于从流接收输入,或者用于输出到流。程序在执行letter=Console::Read();后出现一个输入提示符,假如输入's',然后回车,相当于输入了's ','s'被读到了letter变量里,这时缓冲区里的内容会是' ',即残留了回车键值。Console::ReadLine()每次读取一行,即可以将行尾的回车键读走;Console::Read();每次读取一字符,需要两次将' '读走,这样才能清空到缓冲区。

    原程序的不妥在于,执行Console::ReadLine()时,缓冲区里有 ,它会将缓冲区里第一个 及其前面的内容(这里是空)读走,不必等待用户输入,用户也就没机会输入了。直接就闪了

    在此总结一下网友的测试结果(自己已验证):

      如果只在Console::WriteLine (L"You did not enter a letter." );后添加两个Console::Read();,那么窗口还是消失;
      如果在Console::WriteLine语句后添加三个Console::Read();,那么窗口可以显示;
      如果在Console::WriteLine语句后添加两个Console::Read();和一个Console::ReadLine();,那么窗口也可以显示;
      如果在Console::WriteLine语句后直接添加两个Console::ReadLine();,那么窗口也可以显示;
    而在Console::WriteLine语句后添加一个Console::Read();和一个Console::ReadLine();,窗口也消失了。

    最后贴出自己修改后的的代码

    // 嵌套ifCLR.cpp: 主项目文件。
    
    #include "stdafx.h"
    
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
    	wchar_t letter;
        Console::WriteLine(L"Enter a letter: ");
    
    	letter = Console::Read();
    	if(letter >= 'A')
    		if(letter <= 'Z')
    		{
    			Console::WriteLine(L"You entered a captial letter.");
    			Console::ReadLine();
    			Console::ReadLine();
    			return 0;
    		}
    	if(letter >= 'a')
    		if(letter <= 'z')
    		{
    			Console::WriteLine(L"You entered a small letter.");
    			Console::ReadLine();
    			Console::ReadLine();
    			return 0;
    		}
    	Console::WriteLine(L"You did not enter a letter.");
    	
    	Console::ReadLine();
    	Console::ReadLine();
        return 0;
    }
    




  • 相关阅读:
    Redis集群持久化
    Redis集群介绍
    电脑CPU讲解
    Centos7 k8s v1.5.2二进制部署安装-交付jenkins到k8s集群
    Centos7 k8s v1.5.2二进制部署安装-交付dubbo服务到k8s集群准备工作
    华为云全栈产品福利来袭,终身VIP免费送!
    Centos7 k8s v1.5.2二进制部署安装-dashboard--WEB管理
    Centos7 k8s v1.5.2二进制部署安装-服务暴露ingress控制器之traefik
    简单两步禁止 iOS 系统频繁提示更新,亲测有效
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/Genesis2018/p/8304774.html
Copyright © 2011-2022 走看看