toupper()和tolower()无法正常工作

时间:2016-06-14 05:50:09

标签: c++

这是一段简单的代码,用于交换字符串中字母的大小写。假设它只包含字母而不包含其他内容。但是它只打印了初始字符串,尽管有toupper()和tolower()函数,但它没有对它进行任何更改。

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

void main()
{
char sentence[30];
int i;
cout << "enter a sentence: ";
cin.getline(sentence, 30, '\n')

for (i = 0; i != '\0'; i++)
{
    if (isupper(sentence[i]))
        sentence[i] = tolower(sentence[i]);
    else
        sentence[i] = toupper(sentence[i]);
}

cout << sentence;
system("pause");

}

3 个答案:

答案 0 :(得分:0)

根本不会调用for循环。您正在检查索引变量i,而不是元素。

for (i = 0; i != '\0'; i++)

应该是

for (i = 0; sentence[i] != '\0'; i++)

答案 1 :(得分:0)

你的循环甚至没有运行一次。

将其更改为

 for (i = 0; sentence[i] != '\0'; i++)

最好使用std:string

 string str;
 getline(cin,str);
 for(int i=0;i<str.length();i++)
 {
....

您也可以使用std::transform

char casechange(char i)
{
    if(isupper(i))return tolower(i);
    else
    return toupper(i);
}

std::transofrm(sentence.begin(),sentence.end(),sentence.begin(),casechange);

答案 2 :(得分:0)

整数0将与字符文字'\0'进行比较。这就是永远不会输入循环的原因。

int i = 0;
assert( i == '\0' );

循环顶部等效for (int i = 0; i != 0; ++i)。你要么做两件事之一:

sentence[i]

中查看for (int i = 0; sentence[i] != '\0'; ++i)

或者,使用指针变量迭代字符串

for (char *p = sentence; *p != '\0'; ++p) {
    if (isupper(*p)) {
        *p = tolower(*p);
    } else {
        *p = toupper(*p);
    }
}

但是,使用std::string可以更加干净地使用getline,您可以省去很多麻烦,并且可以轻松使用基于范围的for循环:

std::string sentence;
std::getline(std::cin, sentence);
for (char& c : sentence) {
    if (isupper(c)) {
        c = tolower(c);
    } else {
        c = toupper(c);
    }
}

或者完全使用功能方法摆脱循环:

std::for_each(sentence.begin(), sentence.end(), [](char& c) { c = isupper(c) ? tolower(c) : toupper(c); });