使用单参数函数(C++)将大写字母转换为小写字母,反之亦然



我有一个trans函数,它使用一个参数,必须为void,并通过c返回main中输入的单词中字母的相反大小写。

Example:
input: dOgdoG
output: DoGDOg

函数确实改变了大小写,但我想不出一种方法来构建新单词/替换旧单词,因为我一直在编译关于"的错误;const char";或";无效转换";。

下面的程序给出错误";从charconst char*的转换无效

我只是出于示例的目的更改了函数的类型。

#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
char trans(char c)
{
if(c >= 'a' && c <= 'z')
return c-32;
else
if(c >= 'A' && c <= 'Z')
return c+32;
}
int main()
{
char s[101], s2[101] = "";
cin >> s;
int i;
for(i=0; i<strlen(s); i++)
{
strncat(s2, trans(s[i]), 1);
}
cout<<s2;
return 0;
}

编辑:我从char函数改为void函数,并删除了for的主体。

void trans(char c)
{
if(c >= 'a' && c <= 'z')
c-=32;
else
if(c >= 'A' && c <= 'Z')
c+=32;
}
int main()
{
char s[101], s2[101] = "";
cin >> s;
int i;
for(i=0; i<strlen(s); i++)
{
/// i dont know what to put here
}
cout<<s2;
return 0;
}

不要重新发明轮子。标准库具有识别大小写字母和更改大小写的功能。使用它们。

char trans(char ch) {
unsigned char uch = ch; // unfortunately, character classification function require unsigned char
if (std::isupper(uch))
return std::tolower(uch);
else
return std::toupper(uch);
}

您可能倾向于将else分支更改为else if (std::islower(uch) return std::toupper(uch); else return uch;,但这不是必须的;std::toupper只将小写字母更改为大写字母,因此不会影响非小写字符。

然后,当你调用它时,只需复制结果:

int i = 0;
for ( ; i < strlen(s); ++i)
s2[i] = tran(s[i]);
s2[i] = '';

编辑:

由于似乎需要以艰难的方式做事,让我们将trans更改为匹配:

void trans(char& ch) {
unsigned char uch = ch; // unfortunately, character classification function require unsigned char
if (std::isupper(uch))
ch = std::tolower(uch);
else
ch = std::toupper(uch);
}

现在,您可以将其应用到适当的位置:

for (int i = 0; i < strlen(s); ++i)
trans(s[i]);

我称之为";艰难的道路;因为使用trans的原始版本,您可以直接使用它来修改原始字符串:

for (int i = 0; i < strlen(s); ++i)
s[i] = trans(s[i]);

你可以用它来复制字符串:

for (int i = 0; i < strlen(s); ++i)
s2[i] = trans(s[i]);
// don't forget the terminating nul

有了pass-by-reference,您只能就地修改;复制需要一个额外的步骤:

strcpy(s2, s1);
for (int i = 0; i < strlen(s); ++i)
trans(s2[i]);

strncat采用2个字符串和一个数字作为参数;第二个参数是char,而不是字符串。

您可以将std::transform与字符串实用程序函数(如std::isupperstd::toupper(以及类似的小写函数一起使用。由于问题被标记为c++std::string对于字符串来说比const char*1更可取。

#include <string>
#include <cctype>
#include <iostream>
#include <algorithm>
char trans(unsigned char c){
if (std::isupper(c)) 
return std::tolower(c);
else if (std::islower(c)) 
return std::toupper(c);
else
return c;
}
int main(){
std::string s = "dOgdoG12";
std::string out;
out.resize(s.length());

std::transform(s.begin(), s.end(), out.begin(), trans);
std::cout << out; // DoGDOg12
}

演示


1。SO在char*std::string上的帖子

最新更新