Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试控制台.ReadLine();输入类型_C#_Function_Parsing_Recursion_Types - Fatal编程技术网

C# 测试控制台.ReadLine();输入类型

C# 测试控制台.ReadLine();输入类型,c#,function,parsing,recursion,types,C#,Function,Parsing,Recursion,Types,我正在制作一个控制台应用程序,在这个应用程序中,我会要求用户输入一个电话号码int main\u phone,但是如果他输入一个不能转换为int的字符串,比如“Caramel”,我想给他一个警告并要求输入一个号码 我原以为递归函数就可以了,但我对这个函数缺乏逻辑上的天赋。我想到的是以下代码片段: static int? TryParse(string str) { int tmp; if (int.TryParse(str, out tmp)) { return

我正在制作一个控制台应用程序,在这个应用程序中,我会要求用户输入一个电话号码
int main\u phone
,但是如果他输入一个不能转换为int的字符串,比如“Caramel”,我想给他一个警告并要求输入一个号码

我原以为递归函数就可以了,但我对这个函数缺乏逻辑上的天赋。我想到的是以下代码片段:

static int? TryParse(string str)
{
    int tmp;
    if (int.TryParse(str, out tmp)) {
        return tmp;
    }
    return null;
}//End of TryParse();
            
static int? verifyParse(string str, string lable)
{
    int? testedVar = TryParse(str);
    if (testedVar == null)
    {
        Console.WriteLine("Este campo pode apenas conter dígitos de 0 à 9.");
        Console.Write(lable);
        verifyParse(Console.ReadLine(), lable);
        return null;
    }
    else 
    {
        return testedVar;
    }
}//End of verifyParse();
    
Console.Write("Phone(main):");              
int? main_phone = verifyParse(Console.ReadLine(),"Telefone (Principal):");
问题是,如果用户输入“string”main_phone将返回为null,那么它会请求一个介于0和9之间的数字,但即使用户传递一个可转换的字符串,例如“12”,main_phone仍将为null

我怎样才能解决这个问题

编辑1: 我真正需要的是一个函数,如果字符串可以转换为int,它将返回int,否则它将给我一个错误,并要求我输入0到9之间的内容。我觉得这很难,因为函数必须能够返回一个int或重新运行它(要求并测试一个有效的输入),但它不能,因为它要么返回int,要么什么都不返回

编辑2: 以下是关于我的问题的一些更新:

static int TryParse(string lable)
    {
        string str = Console.ReadLine();
        
        Regex regex = new Regex(@"\d+");
        
        while (!regex.IsMatch(str))
        {
            Console.WriteLine("Insira apenas dígitos de 0-9, por favor.");
            Console.Write(lable);
            str = Console.ReadLine();
        }

        return Convert.ToInt32(str);
    }//End of TryParse();

    Console.Write("Telefone (Principal):");             
    int main_phone = TryParse("Telefone (Principal):");
它工作得非常好,除了当我输入类似“1a”的东西时。在这种情况下,我将得到以下错误:

System.FormatException:输入字符串的格式不正确。 位于System.Number.StringToNumber(字符串str、NumberStyles选项、NumberBuffer&Number、NumberFormatInfo信息、布尔解析十进制) 在System.Number.ParseInt32(字符串s、NumberStyles样式、NumberFormatInfo信息) 在System.Convert.ToInt32处(字符串值) 在App1.Program.TryParse(字符串标签) 在App1.Program.Main处(字符串[]args)
你只需把用户输入的内容作为字符串读入,将所有“-”替换为“”,然后检查它是否为数字,并检查长度。对于这样一个简单的任务,不需要使用递归方法

这个怎么样

[VB.NET]

Function CheckPhoneNumber(ByVal Number As String) As String

Number = Number.Replace("-","")  
Number = Number.Replace("(","")
Number = Number.Replace(")","")

If Not IsNumeric(Number) Then
Return "Error"
Else
Return Number
End If

End Function
[C#]


使用int.TryParse怎么样

void Main()
{
    var input = Console.ReadLine();
    int phone;
    while(!int.TryParse(input, out phone)){
        Console.WriteLine("Please enter a number");
        input = Console.ReadLine();
    }

    Console.WriteLine("Success");
}
要清理输入,可以替换“-”


可以去掉任何额外的字符(“+”、“-”、“#”、“(”、“)”和“*”),然后重试

或者你喜欢的任何东西

当然,另一种选择是使用正则表达式。(注意:我是从这里找到的正则表达式英雄那里偷来的:)


这里有一个解决方案,使用正则表达式验证循环直到生成一个好的匹配

Regex regex = new Regex(@"\d{3}-?\d{3}-?\d{4}");
string phonenumber = Console.ReadLine();

while (!regex.IsMatch(phonenumber))
{
    Console.WriteLine("Bad Input");
    phonenumber = Console.ReadLine();
}

return Convert.ToInt32(phonenumber.Replace("-",""));

它将匹配5555和555-555-5555,并返回int值。

尝试此代码段的修改版本:

        static int? verifyParse(string str, string lable)
        {
            int? testedVar = TryParse(str);
            if (testedVar == null)
            {
                Console.WriteLine("Este campo pode apenas conter dígitos de 0 à 9.");
                Console.Write(lable);
                int? newVal = verifyParse(Console.ReadLine(), lable);
                if (newVal != null)
                    return newVal;
                else
                    return null;
            }
            else
            {
                return testedVar;
            }
        }//End of verifyParse();

正则表达式将是一个很好的途径。然后你可以很容易地接受带有连字符的数字,我只是运行了你的示例。在用户输入可转换字符串的情况下,main_phone在我这边不会返回null。由控制台验证。WriteLine(主电话)。抱歉,如果我误解了您的目标。@Ali.NET尝试运行它并输入“sodapop”,然后当它给您一个错误并要求输入一个数字时,输入任意数字。您将看到它不返回数字,而是返回null。您确实不想/不需要递归。你需要一个简单的while循环,当输入有效时退出,就像在我的回答中一样。但是,每次用户输入错误时,我都必须发送一条消息,没有递归,我怎么做?首先,你应该远离使用递归来解决这个问题。其次,为什么不限制用户输入电话号码的次数呢。他们应该不需要超过2次的尝试才能正确。好的,但因为我不想只在手机上使用@“\d+”。但是,如果用户键入类似“555231409a”的内容,该怎么办?我如何处理在不破坏应用程序的情况下出现的问题?这根本不会破坏应用程序,它会处理得很好
var input = Console.ReadLine().Replace("-", "");
bool successful;
int result;
if(!int.tryparse(string, result))
{
    Console.WriteLine("Invalid phone number");
}
else
{
    Console.WriteLine("Valid phone number");
}
string strRegex = @"[+]?[\d][\d\s()-.]{8,}[\d]";
RegexOptions myRegexOptions = RegexOptions.None;
Regex myRegex = new Regex(strRegex, myRegexOptions);

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
Regex regex = new Regex(@"\d{3}-?\d{3}-?\d{4}");
string phonenumber = Console.ReadLine();

while (!regex.IsMatch(phonenumber))
{
    Console.WriteLine("Bad Input");
    phonenumber = Console.ReadLine();
}

return Convert.ToInt32(phonenumber.Replace("-",""));
        static int? verifyParse(string str, string lable)
        {
            int? testedVar = TryParse(str);
            if (testedVar == null)
            {
                Console.WriteLine("Este campo pode apenas conter dígitos de 0 à 9.");
                Console.Write(lable);
                int? newVal = verifyParse(Console.ReadLine(), lable);
                if (newVal != null)
                    return newVal;
                else
                    return null;
            }
            else
            {
                return testedVar;
            }
        }//End of verifyParse();