大写功能不正常

时间:2017-06-24 05:04:51

标签: c++ function capitalize toupper

我正在学习c ++的基础知识,并且我正在尝试编写一个简单的函数,该函数将给定输入中每个单词的每个字母都大写。我写的:

#include <iostream>
#include <string>
#include <vector>
#include <cctype>

int main()
{
    std::cout << "Please enter a sentence: ";
    std::vector<std::string> words;
    std::string x;

    while (std::cin >> x) {
        words.push_back((std::string) x);
    }
    std::cout << std::endl;
    std::vector<std::string>::size_type size;
    size = words.size();

    for (int j = 0; j != size; j++) {
        std::string &r = words[j];
        for (int i = 0; i != r.length(); i++) {
            r = toupper(r[i]);
            std::cout << r << std::endl;
        }
    }
}

返回每个单词大写的第一个字母。例如,如果我编写hello world,程序将返回:

H
W

有人可以告诉我我做错了什么以及如何解决它。

3 个答案:

答案 0 :(得分:0)

您对每个单词的处理都是错误的:

    for (int i = 0; i != r.length(); i++) {
        r = toupper(r[i]);
        std::cout << r << std::endl;
    }

您实际需要的是仅修改第一个字母:

    r[0] = toupper(r[0]);
    std::cout << r << '\n';

作为一个简化,你的循环:

std::vector<std::string>::size_type size;
size = words.size();
for (int j = 0; j != size; j++) {
    std::string &r = words[j];

可以更简洁:

for (std::string &r : words) {

答案 1 :(得分:0)

for (int j = 0; j != size; j++) {
    std::string &r = words[j];
    for (int i = 0; i != r.length(); i++) {
        r = toupper(r[i]);
        std::cout << r << std::endl;
    }
}

r = toupper(r[i]);,您将r覆盖为长度为1的字符串。因此,您的内部for循环条件变为false,您将退出内循环。所以只打印出每个单词的第一个字母。

要解决此问题,请将toupper的返回值保存到其他变量。

for (int j = 0; j != size; j++) {
    std::string &r = words[j];
    for (int i = 0; i != r.length(); i++) {
        char c = toupper(r[i]);
        std::cout << c << std::endl;
    }
}

答案 2 :(得分:0)

我有一个Utility类,除了用于执行字符串操作的static函数或方法之外什么都没有。以下是我的课程使用toUppertoLower静态方法的样子:

<强>效用

#ifndef UTILITY_H
#define UTILITY_H

#include <string>

class Utility {
public:
    static std::string toUpper( const std::string& str );
    static std::string toLower( const std::string& str );
private:
    Utility();
};

#endif // UTILITY_H
#include "Utility.h"
#include <algorithm>

std::string Utility::toUpper( const std::string& str ) {
    std::string result = str;
    std::transform( str.begin(), str.end(), result.begin(), ::toupper );
    return result;
}

std::string Utility::toLower( const std::string& str ) {
    std::string result = str;
    std::transform( str.begin(), str.end(), result::begin(), ::tolower );
    return result;
}

<强>用法:

#include <string>
#include <iostream>

#include "Utility.h"

int main() {
    std::string strMixedCase = std::string( "hEllO WOrlD" );
    std::string lower = Utility::toLower( strMixedCase );
    std::string upper = Utility::toUpper( strMixedCase );

    std::cout << lower << std::endl;
    std::cout << upper << std::endl;

    return 0;
}

注意: - 这会对传入的字符串进行完整的字符串操作。如果您尝试在字符串中执行特定字符;您可能需要做一些不同的事情,但这是如何将<algorithm>'s std::transform()::toupper::tolower

一起使用的开始