使用单参数函数 (C++) 将大写字母转换为小写字母,反之亦然
Transform uppercase letters to lowercase and vice-versa using single parameter function (C++)
我有 trans
函数,它使用单个参数,必须为 void,而 returns 到 c
与 [= 中输入的单词中的字母相反15=].
Example:
input: dOgdoG
output: DoGDOg
该函数确实改变了大小写,但我无法找到构建新词/替换旧词的方法,因为我不断收到有关“const char”或“无效转换”的编译错误。
以下程序给出错误“从char
到const 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;
}
strncat
接受2个字符串和一个数字作为参数;你的第二个参数是 char
,不是字符串。
不要重新发明轮子。标准库中有识别大小写字母和大小写转换的函数。使用它们。
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] = '[=11=]';
编辑:
由于似乎要求以困难的方式做事,让我们更改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
通过引用传递,您只能修改;复制需要一个额外的步骤:
strcpy(s2, s1);
for (int i = 0; i < strlen(s); ++i)
trans(s2[i]);
您可以使用 std::transform
with string utility functions like std::isupper
, std::toupper
and similarly for lowercase. Since, the question is tagged 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. char*
vs std::string
post
我有 trans
函数,它使用单个参数,必须为 void,而 returns 到 c
与 [= 中输入的单词中的字母相反15=].
Example:
input: dOgdoG
output: DoGDOg
该函数确实改变了大小写,但我无法找到构建新词/替换旧词的方法,因为我不断收到有关“const char”或“无效转换”的编译错误。
以下程序给出错误“从char
到const 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;
}
strncat
接受2个字符串和一个数字作为参数;你的第二个参数是 char
,不是字符串。
不要重新发明轮子。标准库中有识别大小写字母和大小写转换的函数。使用它们。
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] = '[=11=]';
编辑:
由于似乎要求以困难的方式做事,让我们更改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
通过引用传递,您只能修改;复制需要一个额外的步骤:
strcpy(s2, s1);
for (int i = 0; i < strlen(s); ++i)
trans(s2[i]);
您可以使用 std::transform
with string utility functions like std::isupper
, std::toupper
and similarly for lowercase. Since, the question is tagged 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. char*
vs std::string