Функция капитализации не работает должным образом

Я изучаю основы в 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;
}
}
}

возвращает первую букву каждого слова с заглавной буквы. Например, если я напишу привет мир, программа вернет:

H
W

Может кто-нибудь подскажите пожалуйста, что я делаю не так и как это исправить.

-1

Решение

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 условие цикла становится ложным, и вы выходите из внутреннего цикла. Таким образом, только первые буквы каждого слова выводятся на печать.

Чтобы это исправить, сохраните возвращаемое значение 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;
}
}
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) {
0

У меня есть класс Utility, который не содержит ничего, кроме static функции или методы для работы со строками. Вот как выглядит мой класс с toUpper а также toLower статический метод:

Полезность

#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

0