C 检查整个字符串是否为大写

新手上路,请多包涵

我正在尝试检查整个单词是否为大写,如果为真,则应返回真,否则返回假。

我目前的代码是:

 #include "UpperCaseFilter.h"
#include "ReadFilteredWords.h"
#include "ReadWords.h"
#include <locale>

bool UpperCaseFilter::filter(string word) {
    if(!word.empty()) {
        for(int i = 0; i < word.length(); i++) {
            if(isupper(word[i])) {
                return true;

            }
            else {
                return false;
            }
        }
    }
}

这段代码的问题是,如果我有例如 HeLLO ,它将返回 true,因为我的最后一个字符是 true。如果整个字符串为真,我将如何只返回真。我使用计数器方法做到了,但它不是最有效的。

我也尝试使用 all_of 方法,但我认为我没有正确的编译器版本,因为它说 all_of isn't defined (即使导入正确)。

我不确定还有什么其他方法可以解决这个问题。

原文由 beastlycplus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 468
2 个回答

您的循环中不应有两个返回条件。相反,您可以使用循环来查找问题,如果没有问题,您将退出循环并告诉用户最后一切都很好。

在评论中你说“我相信如果字符串为空,它不需要返回任何东西”;但是,具有返回类型的函数,例如这个函数 总是 返回一些东西。如果你不指定返回值,它会给你一个,不管你喜欢与否。因此,您必须决定每个可能的输入的输出应该是什么。因此,我添加了一个 if 语句来强调空字符串的特殊条件。

 #include "UpperCaseFilter.h"
#include "ReadFilteredWords.h"
#include "ReadWords.h"
#include <locale>

bool UpperCaseFilter::filter(const string &word) {
  if(word.empty()) //You'll need to do the right thing here
    return true;

  //Even if the right thing to do were to return true, so that
  //the check above would be redundant, you'd want to leave a
  //comment here pointing out that you've handled the special case

  for(size_t i = 0; i < word.length(); i++)
    if(!isupper(static_cast<unsigned char>(word[i])))
      return false;

  return true;
}

请注意,您之前的函数签名是:

 bool UpperCaseFilter::filter(string word) {

我已将其更改为:

 bool UpperCaseFilter::filter(const string &word) {

const 保证函数不会改变 word 并且 & 符号将字符串传递给函数而不复制它。这使函数更快并节省内存。

原文由 Richard 发布,翻译遵循 CC BY-SA 3.0 许可协议

或者在谓词中将 std::all_of 函数与 std::isupper 结合使用:

 #include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string s = "HELLo";
    if (std::all_of(s.begin(), s.end(), [](unsigned char c){ return std::isupper(c); })) {
        std::cout << "Is uppercase." << '\n';
    } else {
        std::cout << "Is not uppercase." << '\n';
    }
}

用作函数的一部分:

 bool isUpper(const std::string& s) {
    return std::all_of(s.begin(), s.end(), [](unsigned char c){ return std::isupper(c); });
}

原文由 Ron 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题