我有一个trans
函数,它使用一个参数,必须为void,并通过c
返回main
中输入的单词中字母的相反大小写。
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;
}
不要重新发明轮子。标准库具有识别大小写字母和更改大小写的功能。使用它们。
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::isupper
、std::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
上的帖子