C++ 如何更改C+;中字符串的大小写+;?

C++ 如何更改C+;中字符串的大小写+;?,c++,string,case,C++,String,Case,我有一个字符串,可以包含数字以及大小写字母。我需要将所有大写字母转换为小写字母,反之亦然。这件事怎么办 您可以迭代字符串并从每个字母字符中添加或减去适当的数字,以便将ASCII值解析为大小写相反的ASCII值。迭代字符串并使用isupper()确定每个字符是否为大写。如果是大写,请使用tolower()将其转换为小写。如果它不是大写,请使用toupper()将其转换为大写。这里有一种不使用boost的方法: #include <string> #include <algorit

我有一个字符串,可以包含数字以及大小写字母。我需要将所有大写字母转换为小写字母,反之亦然。这件事怎么办

您可以迭代字符串并从每个字母字符中添加或减去适当的数字,以便将ASCII值解析为大小写相反的ASCII值。

迭代字符串并使用
isupper()
确定每个字符是否为大写。如果是大写,请使用
tolower()
将其转换为小写。如果它不是大写,请使用
toupper()

将其转换为大写。这里有一种不使用boost的方法:

#include <string>
#include <algorithm>
#include <cctype>
#include <iostream>

char change_case (char c) {
    if (std::isupper(c)) 
        return std::tolower(c); 
    else
        return std::toupper(c); 
}

int main() {
    std::string str;
    str = "hEllo world";
    std::transform(str.begin(), str.end(), str.begin(), change_case);
    std::cout << str;
    return 0;
}
#包括
#包括
#包括
#包括
字符更改\u情况(字符c){
如果(标准::isupper(c))
返回std::tolower(c);
其他的
返回std::toupper(c);
}
int main(){
std::字符串str;
str=“你好,世界”;
std::transform(str.begin()、str.end()、str.begin()、change_case);
std::cout
char*str=“这是一个测试字符串”;
而(*str!='\0'){
如果(*str='A'){
*str+=32;
}

如果(*str>='a'&&&*str,您也可以翻转32位:使用ASCII字符,因此:

char flipcase(char x)
{
   if( ::isalpha(x) )
   {
      return x ^ 32;
   }
}
您也可以使用表。然后创建一个静态表

char flipcase( char x )
{
   return fliptable[x];
}
后一种方法的优点是,只要外部字符集不是多字节的,就可以将其用于外部字符集,这是行不通的。您可以使用正在使用的任何字符集为wchar_____t字符创建一个类似的表。如果字符的大小不超过n 2,虽然它会对UTF-32使用太多,而且查找时间很短。当然,在现实中,您会为每个字符及其特征存储一个小结构

使用上述任一选项,您将使用std::transform

现在真正聪明的一点是:std::transform可以使用一个类(functor)以及一个普通函数。因此,对于多字节字符,只要替换字符始终具有相同的第一个元素,我们就可以存储状态。如果不是这样,则转换将无法与常规迭代器一起工作。不过,您可以编写自定义迭代器来处理多字节字符串,这些字符串将在一次可打印字符(迭代器必须取消对表示符号的多字节字符的引用)。

\include
#包括
#包括
使用名称空间std;
int main(){
//将大小写改为大写
string var=“这是一个字符串。”;
for(无符号整数i=0;iCUT< P>标准C++方法如下:< /P>
std::string lower = "this is my string to be uppercased";
std::locale loc; //get the locale from the system.
auto facet = std::use_facet<std::ctype<char>>(loc);
facet.toupper(&lower[0], &lower[0] + lower.length()); //they didn't provide a C++ iterator interface, so pointer arithmetic it is.  
std::cout << lower << std::endl;

还有一个
facet.toupper()
来处理从小写到大写的转换,还有
facet.wide
来处理从char到wchar\t的转换,还有
facet.show
来处理从wchar\t到char的转换。这是一个家庭作业问题吗?哈哈,是的。不过,我用Matthew Iselins的建议想出了这个方法。
(char&c:str)C^=32;这不是一个合适的C++答案,IMO。我同意,这将不能在Unicode或任何其他非ASCI字符上工作,但是如果他理解了这个代码背后的思想,那么增加对其他字符集的支持,确保它,防止堆损坏等是一个琐碎的任务。如果没有其他的东西,它将把大写转换成小写。,然后将其改回大写。另外,为什么不使用字符常量('a','z','a','z'))为了更好的可读性,@ PigBin,它不会将大写字母转换成小写,因为光标会使它的位置增加1。-Car *和C函数,如Srxxx、Prtff、ScNf等,都是世界上所有错误的99%。不要用C++来做!如果你要这样做,你最好还是翻转BI。我忘了是哪一个了,但是他们中的一个会交换箱子。小的吹毛求疵-换箱子而不是交换字母?
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main(){
    //Changecase to Uppercase
    string var = "This is a String.";
    for (unsigned int i = 0; i < var.length(); i++){
        if (islower(var[i]))
            var[i] = toupper(var[i]);
    }
    cout << var << endl;
    /*
    Output:
    THIS IS A STRING.
    */
    //Changecase to Lowercase
    var = "This is a String.";
    for (unsigned int i = 0; i < var.length(); i++){
        if (isupper(var[i]))
            var[i] = tolower(var[i]);
    }
    cout << var << endl;
    /*
    Output:
    this is a string.
    */
    //Flip the case
    var = "This is a String.";
    for (unsigned int i = 0; i < var.length(); i++){
        if (isupper(var[i]))
            var[i] = tolower(var[i]);
        else
            var[i] = toupper(var[i]);
    }
    cout << var << endl;
    /*
    Output:
    tHIS IS A sTRING.
    */

    system("pause");
    return 0;
}
std::string lower = "this is my string to be uppercased";
std::locale loc; //get the locale from the system.
auto facet = std::use_facet<std::ctype<char>>(loc);
facet.toupper(&lower[0], &lower[0] + lower.length()); //they didn't provide a C++ iterator interface, so pointer arithmetic it is.  
std::cout << lower << std::endl;
 THIS IS MY STRING TO BE UPPERCASED