2017-06-24 40 views
-1

我正在学习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 

有人能告诉我什么,我做错了,如何解决它。

+1

删除'(std :: string)'cast - 它什么都不做。 –

+0

*我试图编写一个简单的函数,将给定输入中每个单词的每个字母都用大写* - 如果您考虑学习算法函数“C++基础知识”,您可以简单地使用'std :: transform(words [j] .begin(),words [j] .end(),words [j] .begin(),toupper);'而不是'i'循环。 – PaulMcKenzie

回答

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循环条件为假的字符串,你会得到从内循环。所以只有每个单词的第一个字母被打印出来。

若要解决此问题,请将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'; 

作为simplfication,你的循环:

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

我有一个包含什么,但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>'sstd::transform()::toupper::tolower::tolower