C# char.isupper 在将数字放入字符串索引时抛出错误 [关闭]

Posted

技术标签:

【中文标题】C# char.isupper 在将数字放入字符串索引时抛出错误 [关闭]【英文标题】:C# char.isupper throwing error when a number is put in string index [closed] 【发布时间】:2021-07-10 06:38:07 【问题描述】:

我正在尝试制作密码验证器,但是当我输入数字时,此代码会抛出 IndexOutOfRangeException

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Password

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void textBox1_TextChanged(object sender, EventArgs e)
        
            button1.Enabled = false;
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            string password = textBox1.Text;
            if (password.All(c => Char.IsLetterOrDigit(c)))
            
                button4.Text = "✓";
                button4.ForeColor = System.Drawing.Color.Black;
                button4.BackColor = System.Drawing.Color.Green;
                if (password.Length >= 3 && password.Length <= 8)
                
                    button1.Text = "✓";
                    button1.ForeColor = System.Drawing.Color.Black;
                    button1.BackColor = System.Drawing.Color.Green;

                    if (password.Any(char.IsDigit))
                    
                        button2.Text = "✓";
                        button2.ForeColor = System.Drawing.Color.Black;
                        button2.BackColor = System.Drawing.Color.Green;
                        // Error thrown below when I input a number
                        if (char.IsUpper(password[0]) && (char.IsLower(password[8])))
                        
                            label1.Text = "   Valid";
                            label1.ForeColor = System.Drawing.Color.Green;
                            button3.Text = "✓";
                            button3.ForeColor = System.Drawing.Color.Black;
                            button3.BackColor = System.Drawing.Color.Green;
                        
                        else
                        
                            label1.Text = " Invalid";
                            label1.ForeColor = System.Drawing.Color.DarkRed;
                            button2.Text = "✖";
                            button2.ForeColor = System.Drawing.Color.Black;
                            button2.BackColor = System.Drawing.Color.DarkRed;
                        
                    
                    else
                    
                        label1.Text = " Invalid";
                        label1.ForeColor = System.Drawing.Color.DarkRed;
                        button3.Text = "✖";
                        button3.ForeColor = System.Drawing.Color.Black;
                        button3.BackColor = System.Drawing.Color.DarkRed;
                    
                
                else
                
                    label1.Text = " Invalid";
                    label1.ForeColor = System.Drawing.Color.DarkRed;
                    button1.Text = "✖";
                    button1.ForeColor = System.Drawing.Color.Black;
                    button1.BackColor = System.Drawing.Color.DarkRed;
                
            
            else
            
                button4.Text = "✖";
                button4.ForeColor = System.Drawing.Color.Black;
                button4.BackColor = System.Drawing.Color.DarkRed;
            
        
    

【问题讨论】:

你能分享更多关于你的代码的细节吗?你在哪里定义了password 变量?它来自哪里? 不可复制dotnetfiddle.net/Ki2Zql 您的输入字符串至少有 9 个字符长吗?否则,当您尝试访问 password[8] 时,您会得到一个 IndexOutOfRangeException 你得到什么错误,哪一行抛出它? @Rafalon 这是我得到的例外(密码必须是 3-8 个字母长)你能详细说明这个错误的含义吗,我不明白 【参考方案1】:

只是为了让您了解您遇到此问题的原因,代码的相关部分:

您检查您的密码是否严格短于 9 个字符:
    if (password.Length >= 3 && password.Length <= 8)
    
您检查您的密码是否包含数字:
        if (password.Any(char.IsDigit))
        
您尝试访问 无法 访问的 password[8](因为它是第 9 个字符,password[0] 是第一个字符),因此您的例外:
            if (char.IsUpper(password[0]) && (char.IsLower(password[8])))
            

简而言之:

您收到IndexOutOfRangeException 是因为您尝试访问仅包含 3 到 8 个字符的字符串的第 9 个字符。 (第三个if) 只有当您的输入包含数字时才会出现此异常,因为当您的输入包含数字时,您只会尝试访问第 9 个字符。 (第二个if


如果您需要检查长度可变的字符串的最后一个字符,请不要像以前那样对索引进行硬编码。 您可以使用password[password.Length-1] 获取最后一个字符。

【讨论】:

是的,但是只有当我在字符串上输入数字时才会发生这种情况 因为你只有在password.Any(char.IsDigit)(这个代码示例中的第二个if)时才输入这个 那么我该如何解决这个问题? 为什么要检查 3 到 8 个字符的长字符串的第 9 个字符? 查看我更新答案的最后一部分(不要对索引进行硬编码,您需要最后一个字符,然后使用为您提供最后一个字符的公式)

以上是关于C# char.isupper 在将数字放入字符串索引时抛出错误 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ESI 编号的正则表达式 [重复]

我在将字符串从 .txt 文件添加到列表时遇到问题,即使在尝试使用 .append 之后也是如此

在将 HTML 字符串发送到客户端之前格式化 HTML 字符串的 C# 工具[关闭]

C#,.NET,在将请求转换为字符串的函数中检查 null

在将字符串转换为 int 之前检查字符串是不是不是数字 [重复]

有没有办法在将字符串转换为整数后保持字符串中数字的第一个零?