使用单参数函数 (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”或“无效转换”的编译错误。

以下程序给出错误“从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;
}

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 对于字符串,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
}

Demo


1. char* vs std::string

post