当我尝试使用它来测试我的字符串时,如果它们包含数字和字母以外的字符,则以下代码会给出ArgumentOutOfRangeException。
猜测它是有道理的,因为我用注释标记的行将在最后一个索引的边界上运行。我如何解决这个问题,我不可能从(i-1,i)和(i,i)开始。请指教。谢谢。
public static bool LegalString(string s)
{
string dict = "abcdefghijklmnopqrstuvwxyz0123456789";
for (int i = 0; i < s.Length; i++)
{
if (!dict.Contains(s.Substring(i, 1).ToLower()))
{
Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'");//Line that is giving the error
return false;
}
}
return true;
}
编辑:
if (!LegalString(name))
{
MessageBox.Show("Invalid Entry for name. Enter only numbers and alphabets.");
}
我正在使用上述方法。如果我输入一个名称,它将正常工作:Sam。
如果我输入例如,Sam ///它会在我希望显示消息框时返回异常。
答案 0 :(得分:1)
你可以完全避免循环,use a built-in function to test for letter or digit就像这样:
public static bool LegalString(string s) {
if (!s.All(Char.IsLetterOrDigit)) {
Console.WriteLine( "'{0}'", s.First(c => !Char.IsLetterOrDigit(c)));
return false;
}
return true;
}
请注意,内置函数允许使用dict
字符串中未包含的其他字母数字字符。如果这不合适,您可以插入自己的函数来检查单个字符的正确性。
答案 1 :(得分:0)
这一行中的i + 1
是问题所在:
Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'");//Line that is giving the error
如果您尝试显示不在比较字符串中的子字符串,则需要将该行更改为:
Console.WriteLine("'" + s.Substring(i, 1).ToLower() + "'");//Line that is giving the error
修改强>
我修改了你的方法以获得以下内容,并且它的输入字符串是&#34; Sam //&#34;它按预期工作。即它返回false
:
public static bool LegalString(string s)
{
string dict = "abcdefghijklmnopqrstuvwxyz0123456789";
for (int i = 0; i < s.Length; i++)
{
if (!dict.Contains(s.Substring(i, 1).ToLower()))
{
return false;
}
}
return true;
}
答案 2 :(得分:0)
顺便说一下,每次你可以写一个这样的函数时,看看dict
:
bool IsValidChar(char c)
{
return char.IsDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}
答案 3 :(得分:0)
您可以使用正则表达式...
private static bool ContainsNonAlphanumeric(string s)
{
Regex pattern = new Regex(@"\W|_");
if(pattern.IsMatch(s))
{
return true;
}
return false;
}
看看这个小提琴...... http://dotnetfiddle.net/g2YAT0
答案 4 :(得分:0)
行Console.WriteLine("'" + s.Substring(i, i + 1).ToLower() + "'")
中的预期输出是多少。这就是错误,你期待一个长度为i + 1的子字符串。我不这么认为。也许应该是s.Lenght - 我,只有1。
看看吧。