C ++改变字符串函数中的小写字母(再次......)

时间:2014-01-26 00:36:19

标签: c++ string function pointers

这又是我。在我所有的问题中,我认为这是最愚蠢的,但无论是由于疲劳还是愚蠢,我都需要一些帮助。然而,最重要的是,我正在为我的作业做这个,并且有一个严格的规则 - 我必须使用一个函数 名为

char* encode(char* source, char const* alpha)

这是我非常原始的代码:

    int len = strlen(source);
    for (int i = 0; i < len; i++)
    {
        switch (source[i])
        {
        case 'a': source[i] = alpha[0];
        case 'b': source[i] = alpha[1];
        case 'c': source[i] = alpha[2];
        ................................
        ................................
        ................................
        case 'y': source[i] = alpha[24];
        case 'z': source[i] = alpha[25];
        default: source[i] = source[i];
        }
    }
    cout << source << endl;

它基本上应该使输入的字符串source不超过1000个符号将其所有小写符号('a' - 'z')更改为已输入数组的相应符号(26个符号)每个小写字母的总数...'a'用[0]改变,'b'用b [1]等改变。)

我有几个问题:

  1. 我的代码不起作用..输出总是一些奇怪的符号。我该如何解决这个问题?
  2. 我该如何缩短它?也许使用for语句而不是switch
  3. 当它正常工作时,如何将其实现到我在问题开头提到的功能(这可能是最重要的功能)?
  4. 仅供记录,这里也是我的输入代码:

    char source[1001];
    cin.getline(source, 1001, '/n');
    
    char alpha[27];
    cin.getline(alpha, 27);
    

    编辑:我将代码更改为:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        char source[1001];
        cin.getline(source, 1001, '/n');
    
        char alpha[27];
        cin.getline(alpha, 27);
    
        const int len = strlen(source);
        for (int i = 0; i < len; i++)
        {
            if ('a' <= source[i] && source[i] <= 'z')
            {
                source[i] = alpha[source[i] - 'a'];
            }
        }
        cout << source << endl;
        return 0;
    }
    

    然而它变得越来越困难。现在我的控制台输入永远不会结束....字面意思..点击Enter不会阻止它..没有什么事情..当我将cin.getline source更改为10时,它以某种方式结束了虽然再次返回那些奇怪的符号 - ╠╠╠╠

5 个答案:

答案 0 :(得分:3)

在switch语句中,当案例匹配时,除非在每种情况结束时使用break,否则代码将执行以下所有情况。您的代码总是不断下降并达到默认情况。

答案 1 :(得分:1)

您的switch语句会执行每一步,因为您从不breakreturn

更好:

for (int i = 0; i < len; i++) {
    if('a' <= source[i] && source[i] <= 'z') {
        source[i] = alpha[source[i] - 'a'];
    }
}

说明:

source[i] - 'a' 0'a'1'b'等。它概括了您的模式。

答案 2 :(得分:1)

使用cstring代替string

#include <cstring>

并将switch替换为if (source[i] >= 'a' && source[i] <= 'z') ...

这是您的最终代码:https://eval.in/95037

#include <iostream>
#include <cstring>

using namespace std;

void encode(char *source, const char *alpha)
{
    int i, j;
    int len = strlen(source);
    for (i = 0; i < len; i++) {
        if (source[i] >= 'a' && source[i] <= 'z') {
            j = source[i] - 'a';
            source[i] = alpha[j];
        }
    }
}

int main(void)
{
    char source[1001];
    char alpha[27];
    cin.getline(source, 1000);
    cin.getline(alpha, 27);
    encode(source, alpha);
    cout << source << endl;
    return 0;
}

答案 3 :(得分:0)

如果你被允许,你可以忽略c风格的字符串alpha并使用cctype函数toupper(c)。

#include <cctype>
for (size_t i = 0; i < strlen(source); i++) {
    source[i] = toupper(source[i]);
}

答案 4 :(得分:0)

在c ++中:

#include <algorithm>
#include <string>
    wstring toLower(const wstring& str)
    {
        wstring temp = str;
        std::transform(temp.begin(), temp.end(), temp.begin(), ::towlower);
        return temp;
    }
    //--------------------------------------------------------------------------------------------------------------------- 
    string toLower(const string& str)
    {
        string temp = str;
        std::transform(temp.begin(), temp.end(), temp.begin(), ::tolower);
        return temp;
    }