代码之家  ›  专栏  ›  技术社区  ›  Mr Awesome8

快速检查字符串是否为大写字母的方法

  •  4
  • Mr Awesome8  · 技术社区  · 8 年前

    我正在用C语言为聊天室编写一个机器人,我想检测一条消息是否包含太多大写字母。如果邮件的大写字母总数超过 one-third 13 。这是为了防止标记较小的邮件。

    2000 我无法改变这一点。用我的方法,它开始停滞 500+ 字符。这给了垃圾邮件发送者足够的时间粘贴消息并再次发送,在机器人努力跟上的同时,有效地淹没了聊天。

    我目前拥有的代码:

    bool isMostlyUpper = (message.Count(c => char.IsUpper(c)) >= message.Length * 0.3f) && message.Length > 13;
    

    string.ToUpper() 因为我仍然想检测消息是否大部分是大写而不是全大写。

    有没有办法做到这一点而不在每个字符上循环?还是一种更快实现结果的方法?我可以添加检查以查看消息是否正确 > 500 但有时会有 500+

    2 回复  |  直到 8 年前
        1
  •  2
  •   I.B    8 年前

    如果你在达到状态时打破了foor循环,在某些情况下你会节省一些时间

    int count = 0;
    float maxLenght = message.Length * 0.3f;
    bool isMostlyUpper = false;
    
    foreach (char c in message)
    {
        if (char.IsUpper(c))
        {
            count++;
        }
    
        if(count >= maxLenght)
        {
            isMostlyUpper = true;
            break;
        }
    
    }
    

    您还可以跟踪标记的最后一条消息,并将其与收到的新消息进行比较,这样可以阻止人们对同一条消息进行垃圾邮件发送,并且您不必多次重新计算同一条消息。

        2
  •  0
  •   Olivier Jacot-Descombes    8 年前

    private static bool IsMostlyUpper (string message)
    {
        if (message.Length > 13) {
            int step = 1 + message.Length / 100; // integer division.
            // 1 for message length < 100
            // 2 for message length < 200
            // 3 for message length < 300
    
            int limit = message.Length / step / 3;
            int upperCase = 0;
            for (int i = 0; i < message.Length; i += step) {
                if (Char.IsUpper(message[i])) {
                    upperCase++;
                    if (upperCase >= limit) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    


    如果你认为一个非常智能的机器人可以欺骗你的算法,你也可以创建一个随机除数

    private static Random _random = new Random(); // static field
    

    使用创建除数

    int divisor = _random.Next(150, 200);
    int step = 1 + message.Length / divisor;