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\r\n','s'被读到了letter变量里,这时缓冲区里的内容会是'\r\n',即残留了回车键值。Console::ReadLine()每次读取一行,即可以将行尾的回车键读走;Console::Read();每次读取一字符,需要两次将'\r\n'读走,这样才能清空到缓冲区。

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

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

  如果只在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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值