如何在C ++中将字符串的小写字符转换为大写字符?

时间:2017-06-03 16:03:09

标签: c++ string class output uppercase

我有一个问题,其中字符串的所有小写字符都应转换为大写字符。但根据问题,代码中的某些行不应更改。我写了下面的代码。

 #include <iostream>
 #include <string>
 #include <stdio.h>
 #include <ctype.h>
 using namespace std;

 class StringOps {
 public:
   void stringToUpper(string &s) //This line should not be changed
  {
    char c;
    int i=0;
    while (s[i])
    {
     c=s[i];
     putchar (toupper(c));
     i++;
    }
  }
 };

 int main(void)
 {
   string str ="Hello World";  
   StringOps obj;
   obj.stringToUpper(str);
   cout << str;            //This line should not be changed
   return 0;
   }

我得到的输出为:

HELLO WORLDHello World

但所需的输出是:

HELLO WORLD HELLO WORLD

如何制作

 cout<<str; 
main()中的

语句用于打印函数中计算的结果:

 void stringToUpper(string &s)

3 个答案:

答案 0 :(得分:0)

仅针对ASCII字符的下半部分的解决方案。

class StringOps {
public:
  void stringToUpper(string& s) //This line should not be changed
  {
    for (size_t i = 0; i < s.size(); ++i) {
      if (s[i] > 96 && s[i] < 123)
        s[i] -= 32;
    }
  }
};

如果您关心ASCII表的较高部分:

class StringOps {
public:
  void stringToUpper(string& s) //This line should not be changed
  {
    for (size_t i = 0; i < s.size(); ++i) {
      s[i] = toupper(s[i]);
    }
  }
};

如果你有一些多字节编码,比如UTF-8,你需要一些库。

答案 1 :(得分:0)

  

cout&lt;&lt;海峡; //不应更改此行

这意味着您必须更改str

  

void stringToUpper(string&amp; s)//不应更改此行

好消息是,您的方法将s作为参考。

在您的代码中,您正在执行c=s[i];,您应该在字符串s[i] = c中重新分配字符

答案 2 :(得分:0)

您只是打印字符串,并将每个字符设为上部字符,但传递给函数(通过引用)“s”的字符串不会更改。

void stringToUpper(string &s)

可以添加一行以使s在void stringToUpper(string&amp; s)中更改

 s[i] = toupper(c);

代码看起来

 c=s[i];
 s[i] = toupper(c);
 putchar (toupper(c));
 i++;

输出

HELLO WORLDHELLO WORLD