微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对向量字符串中的第一个字符使用 toupper

如何解决对向量字符串中的第一个字符使用 toupper

如何使用 toupper() 将字符串向量中每个元素的第一个字母转换为大写?

这是我试过的...

string word;
vector<string> text;
while(cin >> word){
    text.push_back(word);
}

for(decltype(text.size()) i = 0; i != text.size()) {
    text[0] = toupper(text);
}

解决方法

for(auto& s : text)
    if (!s.empty()) s[0] = std::toupper(s[0]);

或者更花哨的:

std::transform(std::istream_iterator<std::string>{std::cin},{},std::back_inserter(text),[](auto s) {
                  if (!s.empty()) s[0] = std::toupper(s[0]);
                  return s;
              });
,

你可以简单地这样做,

string word;
vector<string> text;
while(cin >> word){
    word[0] = static_cast<char>(toupper(static_cast<int>(word[0])));;
    text.push_back(word);
}

现在您不必遍历单词列表来将每个条目的第一个字母更改为大写。

,

您的代码存在一些问题。

您的第二个循环无休止地运行,您需要在循环末尾添加 ++i 以实际迭代向量中的每个字符串并在到达向量末尾时终止循环:

for(decltype(text.size()) i = 0; i != text.size(); ++i)

附带说明,您可以将 decltype(text.size()) 替换为 vector<string>::size_typedecltype(text)::size_type

range-based for loop 可以避免这两个问题:

for(string &str : text)

关于您的实际错误,此行无法编译:

text[0] = toupper(text);

因为 toupper() 接受单个字符作为输入,但您将向量本身传递给它,而不是向量中单个字符串中的单个字符。您本来需要这样做:

text[i][0] = toupper(text[i][0]);

但是,您实际上需要在将字符传递给 unsigned char 时将它们转换为 toupper(),例如(我将每个步骤分开以便您可以更清楚地看到它):

string &str = text[i];
char ch = str[0];
unsigned char uc = static_cast<unsigned char>(ch);
uc = toupper(uc);
ch = static_cast<char>(uc);
str[0] = ch;
text[i] = str;

显然,如果您愿意,也可以写成字符串表达式:

text[i][0] = static_cast<char>(
  toupper(
    static_cast<unsigned char>(
      text[i][0]
    )
  )
);

需要演员表的原因在 this reference page 中有解释:

参数

ch - 要转换的字符。 **如果 ch 的值不能表示为 unsigned char 并且不等于 EOF,则行为未定义。

...

<cctype> 中的所有其他函数一样,如果参数的值既不能表示为 unsigned char 也不等于 EOF,则 std::toupper 的行为是未定义的。要安全地将这些函数与普通的 chars(或 signed chars)一起使用,应首先将参数转换为 unsigned char

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。