【问题标题】:Check if all the letters in a string are capital recursively递归检查字符串中的所有字母是否都是大写的
【发布时间】:2012-10-09 05:16:51
【问题描述】:

我必须检查所有字母是否都是递归的大写字母,我不知道为什么这不起作用:

public static bool IsCapital(string str)
    {
        if (str.Length == 1)
            return int.Parse(str[0].ToString()) > 65 && int.Parse(str[0].ToString()) < 90;
        return IsCapital(str.Substring(1)) && int.Parse(str[0].ToString()) > 65 && int.Parse(str[0].ToString()) < 90;
    }

它崩溃并说:“未处理的异常:System.FormatException:输入字符串的格式不正确。”

Console.WriteLine(IsCapital("abc"));

谢谢。

【问题讨论】:

  • 是否需要递归?看来str == str.ToUpper() 可能会产生您想要的结果。
  • @AustinSalonen 家庭作业并不总是有意义的。
  • 我也会创建一个IsCapital(char c) 方法(假设您不能使用现有的char.IsUpper),而不是将该逻辑放入该方法中。这将有助于清理代码。
  • 正如 NullUserException 所说,我也觉得很愚蠢
  • 只是确保... ;-)

标签: c# string recursion


【解决方案1】:

您正在尝试将 char 解析为 int,而不是将其转换为 int

您正在做的是获取一个字母,例如A,并将其解析为一个 int。 A 无论如何都不是数字,因此解析失败。

您要做的是将 char 显式转换为 int 以获得您正在寻找的 ASCII 值:

if (str.Length == 1)
{
    return ((int)str[0]) > 65 
        && ((int)str[0]) < 90;
}
return IsCapital(str.Substring(1)) 
    && ((int)str[0]) > 65 
    && ((int)str[0]) < 90;

【讨论】:

  • 仅供参考 -- str[0] &gt; 65 编译。
  • 好的,我修好了,现在可以用了,但是不好,好像总是返回false,这是为什么呢?
  • 是的,正如@AustinSalonen 所说,65 是“A”,90 是“Z”,您想使用 >= 和
【解决方案2】:

我假设您尝试使用 int.Parse(str[0].ToString()) 执行的操作是获取 ASCII 值。

你需要使用的是这个(int)str[0]

解析会尝试将字符串转换为数字,因此值为 '412' 的字符串将被解析为值为 412 的 int。

【讨论】:

    【解决方案3】:
    public static bool IsCapital(string str)
    {
     return !Regex.IsMatch(str, "[a..z]");
    }
    

    【讨论】:

    • 首先,这是行不通的(这对于任何带有非字母字符的字符串都会产生误报),其次,它不使用递归,这是问题的一个约束
    • -1 反正正则表达式是错误的。 [a..z] 匹配 a、z 或点 - 仅此而已。
    【解决方案4】:

    我必须在递归中检查所有字母是否都是大写字母

    public static bool IsCapital(string str)
    {
        if (String.IsNullOrEmpty(str)) return false;
        if (str.Length == 1 &&  char.IsUpper(str[0])) return true;
        return char.IsUpper(str[0]) ? IsCapital(str.Substring(1)) :false;
    }
    

    【讨论】:

      【解决方案5】:

      我认为,数字比较是行不通的。

      首先,即使所有字母都是大写字母,它也会对像“ABC123”这样的字符串返回 false。其次,有许多国家字符不在 65..90 范围内,即使它们是大写字母。你应该(如果可以的话)使用一些 Char 方法 http://msdn.microsoft.com/en-us/library/d1x97616.aspx

      【讨论】:

        【解决方案6】:

        要单独解决异常,不要解析字符串。您可以直接将char 与任何ushort 值进行比较。

        换句话说,这是一个有效的检查(没有字符串解析)

        str[0] > 65
        

        AsciiTable.com 应该告诉你为什么你的检查会在边缘失败。

        还要考虑...

        • 不是字母的字符。
        • IsCapital(null)

        最后,可能使这更容易的事情(假设非字母被绕过)是创建一个类似于bool IsNotLowerCase(char c) 的方法。

        注意——这些都假设为 ASCII,我的链接很明显。

        如果您必须支持完整的 Unicode,希望您可以使用methods of char

        【讨论】:

          【解决方案7】:

          虽然有很多方法可以给这只猫换皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后做起来就很简单了。使用扩展方法时,您还可以避免使用 RegEx,因为它比直接字符检查要慢。我喜欢使用 Extensions.cs NuGet 包中的扩展。它使这项检查变得如此简单:

          1. 将 [https://www.nuget.org/packages/Extensions.cs][1] 包添加到您的项目中。
          2. 将“using Extensions;”添加到代码顶部。
          3. "smith".IsUpper() 将返回 False,而 "SMITH".IsUpper() 将返回 True。 4. 其余代码中的所有其他检查都只是MyString.IsUpper()

          您的示例代码将变得如此简单:

          using Extensions;
          
          //Console.WriteLine(IsCapital("abc"));
          Console.WriteLine("abc".IsUpper());
          

          【讨论】:

            猜你喜欢
            • 2014-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-12
            • 2016-05-14
            • 1970-01-01
            相关资源
            最近更新 更多