c ++用数字替换字符

时间:2015-04-06 18:45:24

标签: c++ arrays string

我有这个代码。我想要做的是用指定的数字替换每个字母的每个字母。就像A是10,依此类推,直到J,19。如果我的char数组中只有一个字母,我的代码效果很好,但是如果我有更多的字母,它会复制无用的东西。我认为strncat出了点问题。

#include<conio.h>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
    char litera[11]={"ABCDEFGHIJ"};
    char cifra[11]={"0123456789"};
    char rezultat[256]={0};
    int n;cin>>n;cin.get();
    for(int i=0;i<n;i++)
    { 
        char x[256];
        cin.get(x,256);cin.get();
        int k=strlen(x);
        for(int j=0;j<k;j++)
        {
            int p = strchr(litera,x[j])-litera;  
            if(p>=0 )
            {
                strncat(rezultat, x,j); 
                // my p is the indicator for letter and number
                strcat(rezultat,"1");
                // I'm copying an 1 there because i have numbers 
                // between 10-19 and in my int array i have only
                // the second cipher
                strcpy(x,x+j);
                rezultat[strlen(rezultat)]=cifra[p];
            }
        }
        cout<<rezultat<<endl;
        memset(rezultat,0,sizeof(rezultat));
    }
    getch();
return 0;
}

Input:  07B, 1AA, C8A
Output: 0711, 11010, 12810

我的输出: 0711 110AA1 12C810

如果你们能告诉我问题出在哪里,你会给我很多帮助,每一个建议都很受欢迎,即使不是这个问题。谢谢!

2 个答案:

答案 0 :(得分:0)

如果允许使用矢量和字符串,那么您可以尝试以下(我测试它并且它可以工作。)这里的输入应该是逐行的(每行是要转换的新字符串)但当然你可以根据您的输入格式修改此部分:

包括:

#include <vector>
#include <iostream>
#include <string>
//#include <conio.h>
//#include <cstring>
//using namespace std;


int main()
{
int n; 
std::cin >> n;

while (n--)
{
    string input;
    std::cin >> input;

    vector<char> resultat;

    for (int i = 0; i < input.size(); i++)
    {
        if (input.at(i) >= 'A' && input.at(i) <= 'J') // it is a letter between A and J
        {
            int number = input.at(i) - 'A' + 10;
            char ones = (char)(((int)'0') + (number % 10));
            char tens = (char)(((int)'0') + (number / 10));

            resultat.push_back(tens);
            resultat.push_back(ones);
        }
        else 
            resultat.push_back(input.at(i));                
    }

    for (int i = 0; i < resultat.size(); i++) 
    {
        std::cout << resultat[i];
    }
    std::cout << endl;
}
}

如果不允许使用字符串,只需使用您的字符数组。您的输入格式似乎没有任何问题。

如果不允许vector,那么你可以创建一个char指针,根据最终的大小初始化它。

例如:

int newSize=0;

for (int i = 0; i < input.size(); i++)
    {
        if (input.at(i) >= 'A' && input.at(i) <= 'J')           
            newSize+=2;
        else
            newSize++;            
    }
char* resultat = new char[newSize];

...

然后填写结果。

希望有所帮助!

答案 1 :(得分:0)

您是否必须使用多个阵列?您可以仅为指定的输入执行switch-case。由于您要用数字10-19替换字母A-J,因此您可以在开关情况下轻松实现此功能。您也可以检查输入是否错误。

如果你必须使用数组,首先要问的是你为什么数字数组是单个数字?这是约束吗?不能使用:

char cifra[11]={"10","11","12","13","14","15","16","17","18","19"};

对于数组而言,那样你可以引用数组索引并用索引替换它?这样,您可以通过使用索引引用来替换基于索引的输出来补充数组,例如A是字母数组的索引1,它引用数字数组的索引1为“10”,因此您只需打印数组索引值到变量并输出它。