【问题标题】:toupper() not working in a for range looptoupper() 在 for range 循环中不起作用
【发布时间】:2016-07-10 01:38:01
【问题描述】:

任何人都可以阐明这不起作用吗?我通过将 toupper() 表达式更改为使每个字符都成为“X”并且有效的表达式来测试它是否正确地直接引用了字符,所以我不知道出了什么问题。

 for (decltype(words.size()) i = 0; i < words.size(); ++i) {
    for (auto &u : words[i])
        toupper(u);
    if ((i % 8) != 0)
        cout << words[i] << ' ';
    else
        cout << endl << words[i] << ' ';
}

【问题讨论】:

    标签: c++ visual-c++ toupper


    【解决方案1】:

    这是因为您正在丢弃 toupper() 返回的内容。

    要保存转换后的字符,请更改

    toupper(u);
    

    u = toupper(u);
    

    【讨论】:

    • 哇,谢谢你,我觉得自己像个白痴。感谢您抽出宝贵时间!
    【解决方案2】:

    toupper 签名是 int toupper(int c),而不是 void toupper(char&amp; c)。它返回修改后的值,它不会通过引用改变任何东西。

    也许你想做类似的事情

    std::transform(words[i].begin(), words[i].end(), words[i].begin(), [](char c) { return std::toupper(c); });
    

    【讨论】:

    • 引用是在 for range 循环中定义的...我可能没有完全正确理解您的答案,但 MikeCAT 提供的答案有效,这让我相信 toupper() 完全有能力处理参考变量
    • toupper 是按值取参数,而不是按引用,不可能修改原来的值。这就是为什么您需要像 MikeCAT 答案那样重新分配返回值。我建议您使用 std::transform 无需手动迭代的方法。
    • 哦,我明白你指的是什么,我只是误读了你的答案。好的,再次感谢你,我不打算让 toupper() 做这项工作,但如果我这样做的话,这会对我有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2013-12-31
    • 2017-01-14
    • 2011-07-21
    相关资源
    最近更新 更多