如何在C#中读取控制台输入直到遇到空格或回车
实现C#中类似C++ std::cin的输入读取方式
嘿,我刚学C#的时候也纠结过这个问题!要实现像C++里std::cin那样——不管输入是空格分隔还是换行分隔,都能逐个读取独立的输入项(比如输入a b c不管是一行输入还是分三行输入,结果都能读到a、b、c这三个项),其实有几种实用的方法,我给你详细说说:
方法1:读取行并拆分(简单快捷)
这种方法适合大多数场景,核心思路是先读取所有输入行,再把每行内容按空白字符(空格、换行、回车)拆分,最后收集所有非空的输入项。
代码示例:
using System; using System.Collections.Generic; class Program { static void Main() { List<string> inputItems = new List<string>(); string currentLine; // 循环读取每一行输入,直到输入结束(比如按Ctrl+Z) while ((currentLine = Console.ReadLine()) != null) { // 拆分当前行,按所有空白字符分割,同时移除空字符串(避免多个空格导致的空项) string[] lineItems = currentLine.Split( new[] {' ', '\t', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries ); inputItems.AddRange(lineItems); } // 遍历输出所有读取到的项,和std::cin效果一致 foreach (string item in inputItems) { Console.WriteLine($"读取到输入项:{item}"); } } }
方法2:手动逐字符读取(灵活可控)
如果你需要更实时的逐词读取(比如输入一个词就处理一个,不用等整行输入完),可以手动读取每个字符,跳过空白字符,直到遇到下一个空白字符时返回当前单词。这种方式更贴近std::cin的底层逻辑。
代码示例:
using System; using System.Text; class Program { static void Main() { string word; // 循环读取单词,直到输入结束 while ((word = ReadNextWord()) != null) { Console.WriteLine($"读取到单词:{word}"); } } // 自定义方法:读取下一个非空白字符组成的单词 static string ReadNextWord() { StringBuilder wordBuilder = new StringBuilder(); int charCode; // 先跳过开头的所有空白字符(空格、换行、回车等) while ((charCode = Console.Read()) != -1 && char.IsWhiteSpace((char)charCode)) { // 什么都不做,只是跳过空白 } // 如果读取到输入结束(比如Ctrl+Z),返回null if (charCode == -1) return null; // 开始读取字符,直到遇到空白字符或输入结束 do { wordBuilder.Append((char)charCode); charCode = Console.Read(); } while (charCode != -1 && !char.IsWhiteSpace((char)charCode)); return wordBuilder.ToString(); } }
小提示
- 第一种方法代码简洁,适合一次性处理所有输入的场景;
- 第二种方法能实时处理每个输入项,适合需要边输入边处理的情况;
- 两种方法都能处理任意空白分隔的输入,不管是空格、换行还是制表符,效果和
std::cin完全一致。
内容的提问来源于stack exchange,提问作者Vesk
相关产品推荐
相关产品推荐

