这是一段简单的代码,用于交换字符串中字母的大小写。假设它只包含字母而不包含其他内容。但是它只打印了初始字符串,尽管有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");
}
答案 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); });