【发布时间】:2022-01-08 03:03:39
【问题描述】:
我有 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;
}
【问题讨论】:
-
查找
toupper和tolower函数。 -
不要乱搞
strncat;你知道s2足够大来保存结果,因为你是这样写的。所以就去做吧:s2[i] = trans(s[i]);。并且不要忘记 nul 终止符;它在最后一个字符之后,所以循环到strlen(s)不会到达它。 -
@PeteBecker:或者直接对
s进行更改。 -
@ScottHunter - 也许,但问题是关于“构建新词/替换旧词”,问题中的代码构建新词。
-
在
for循环中包含i<strlen(s)可能意味着您的循环具有O(N*N)时间复杂度,其中N是s的长度,因为strlen(s)本身具有@987654346 @ 复杂性,for循环本身运行N次。我建议在循环之前使用语句int len = strlen(s);,然后使用i<len而不是i<strlen(s)。 (看看joelonsoftware.com/2001/12/11/back-to-basics/.)
标签: c++ string word uppercase lowercase