【问题标题】:How to convert user input to an int Array in c#如何在c#中将用户输入转换为int数组
【发布时间】:2015-11-22 20:18:46
【问题描述】:

我发现最接近这个问题的答案是使用 for 循环将几个字符串输入转换为一个数组。

我只想取 1 个字符串并将前 7 位数字转换为 int 数组。

此代码获取字符的整数值,然后根据 Unicode 值对它们进行测试以返回 true,如果有效,则返回 false,以重复 while 循环并再次请求输入。当我使用 Console.Read();方法,并先输入一个无效值,它会说我的代码在 7 次以上迭代中都无效。这意味着即使字符串具有有效输入,console.Read() 也必须再运行 7 次。

public static void GetDigits(ref int[] callNumberArray, ref bool valid)
        {
        Console.WriteLine("Please enter the code you wish to dial.");
        while ( valid == false)
        {//This loop will reiterate the read() function if the code is not valid.
            valid = true;
            for (int i = 0; i < 7; i++ )
            {
                if (i != 6 && i!= 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
                {
                    i = 0;
                }
                callNumberArray[i] = Console.Read();// I want to change this

            }
            for (int i = 0; i < 7; i++)
            {
                if (i != 6 && i != 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
                {
                    i = 0;
                }
                if (callNumberArray[0] == 53)
                {
                    valid = false;
                }
                if (callNumberArray[i] < 49)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 57 && callNumberArray[i] < 65)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 90 && callNumberArray[i] < 97)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 122)
                {
                    valid = false;
                }
            }
            if (valid == false)
            {
                Console.WriteLine("You entered an invalid code. Please re-enter your code.");
            }

        }

【问题讨论】:

  • if (i != 6 &amp;&amp; i!= 5 &amp;&amp; i != 5 &amp;&amp; i != 4 &amp;&amp; i != 3 &amp;&amp; i != 2 &amp;&amp; i != 1 &amp;&amp; i != 0) 行有什么意义?您有多少次看到循环变量的值超出循环范围?
  • 我的代码中出现了一个错误,导致 i 的值变为 33 和 38,我认为这是因为 while 循环重复了 for 循环,所以我使用了用于控制 i 变量。
  • 我想我对你的问题的回答是 2 次。 :)
  • the value of i to become 33, and 38 这是不可能的。只是不要将i从for语句中修改出来
  • 我运行了调试程序,并逐步完成了程序,我向你保证。

标签: c# arrays


【解决方案1】:

我认为你应该使用正则表达式,例如:

MatchCollection matchList = Regex.Matches(Content, Pattern);
var list = matchList.Cast<Match>().Select(match => match.Value).ToList();

【讨论】:

  • 我正在使用 .net 框架。不确定我是否有那个库
  • 这些“库”在 .NET 行话中称为共享对象。答案使用System.LinqSystem.Collections.GenericsSystem.Text.RegularExpressions。将它们包含在您的代码中以便能够使用此代码示例。
  • 我不知道如何使用它。我还是很傻。我仍在使用 OOP。
  • 在代码的最高位。有许多using 语句。默认情况下,linq 和泛型集合由 IDE(VS:visual studio)添加,只需添加正则表达式。这个答案(很遗憾)使用了 c# 中的一些高级主题:Linq、集合(泛型)、lambda 表达式、正则表达式......我强烈建议您稍后采纳 Felix 的答案并了解这些主题。
【解决方案2】:

我只想取 1 个字符串并将前 7 位数字转换为 int 数组。

string subString = Console.ReadLine().Substring(0,7);
//Check if the whole string is a parsable number
if(int.TryParse(subString) == false) 
{
      Console.WriteLine("Not a valid number..."); 
      return;
} 
//convert it an int[]
int[] values = subString.ToCharArray().Select( value => int.Parse(value.ToString())).ToArray();

基本上就是这样,如果您想逐个字符地进行操作,那也可以,但是如果您愿意,使用int.TryParse() 或正则表达式[0-9](每个字符)检查数字要容易得多那个。

【讨论】:

  • 谢谢,我以后肯定会用到它。
【解决方案3】:

不确定您编写的“算法”,我同意 Sergey Berezovskiy 的观点,即 if 看起来很奇怪,无论如何这应该回答您的具体问题:

public static void GetDigits(ref int[] callNumberArray, ref bool valid)
    {
    Console.WriteLine("Please enter the code you wish to dial.");
    while ( valid == false)
    {//This loop will reiterate the read() function if the code is not valid.
        valid = true;
        for (int i = 0; i < 7; i++ )
        {
            if (i != 6 && i!= 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
            {
                i = 0;
            }
            callNumberArray[i] = Console.Read();// I want to change this

        }
        for (int i = 0; i < 7; i++)
        {
            if(!valid) break;
            if (i != 6 && i != 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
            {
                i = 0;
            }
            if (callNumberArray[0] == 53)
            {
                valid = false;
            }
            if (callNumberArray[i] < 49)
            {
                valid = false;
            }
            if (callNumberArray[i] > 57 && callNumberArray[i] < 65)
            {
                valid = false;
            }
            if (callNumberArray[i] > 90 && callNumberArray[i] < 97)
            {
                valid = false;
            }
            if (callNumberArray[i] > 122)
            {
                valid = false;
            }
        }
        if (valid == false)
        {
            Console.WriteLine("You entered an invalid code. Please re-enter your code.");
        }

    }

【讨论】:

  • 太搞笑了。我不知道为什么我没有想到这一点。哈哈,希望它有效。
  • 好的,祝你好运,虽然我真的建议尝试审查整个代码,但这与问题无关
【解决方案4】:

这里是提示用户输入电话号码,拒绝无效字符并显示当前电话号码的方法,并用占位符表示要输入的号码:

private static int[] GetPhoneNumber(int phoneLength = 7)
{
    List<int> phoneNumbers = new List<int>();

    while (true)
    {
        EditorFor("Phone", String.Concat(phoneNumbers), phoneLength);

        var key = Console.ReadKey(intercept: true);
        if (key.Key == ConsoleKey.Escape) 
            return new int[0]; // return empty array if user cancelled input

        var c = key.KeyChar;
        if (!Char.IsDigit(c))
            continue;

        phoneNumbers.Add(Int32.Parse(c.ToString()));
        if (phoneNumbers.Count == phoneLength)
        {
            EditorFor("Phone", String.Concat(phoneNumbers), phoneLength);
            return phoneNumbers.ToArray();
        }
    }
}

提示输入:

private static void EditorFor(string label, string value, int length)
{
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new String(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop);

    int charactersLeftToInput = length - value.Length;
    string placeholder = new String('*', charactersLeftToInput);

    Console.Write("{0}: {1}{2}", label, value, placeholder);
    Console.CursorLeft -= charactersLeftToInput;
}

用法:

Console.WriteLine("Please enter the code you wish to dial.");
int[] code = GetPhoneNumber(); // if you want default length

控制台:

【讨论】:

  • 这太棒了。我不认为我可以使用它,我的老师可能会认为我在作弊。不过谢谢。
【解决方案5】:

好的,经过深思熟虑,我决定为数组中的每个元素使用单独的Console.Read();,现在它正在做我想做的事情。

while ( valid == false)
        {
            valid = true;
            callNumberArray[0] = Console.Read();
            callNumberArray[1] = Console.Read();
            callNumberArray[2] = Console.Read();
            callNumberArray[3] = Console.Read();
            callNumberArray[4] = Console.Read();
            callNumberArray[5] = Console.Read();
            callNumberArray[6] = Console.Read();
//etc etc...

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 2021-07-27
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多