2015-04-06 160 views
-2

我有這段代碼。我想要做的是用指定的數字替換每個字符的每個字母。就像A是10,依此類推直到J,19。如果我的char數組中只有一個字母,那麼我的代碼運行良好,但如果我有更多的代碼,它會複製無用的東西。我認爲strncat有些問題。C++用數字替換字符

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

int main() 
{ 
    char litera[11]={"ABCDEFGHIJ"}; 
    char cifra[11]={""}; 
    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 

我的輸出: 110AA1 12C810

如果你們能告訴我問題出在哪裏,你會幫我很多,每一個建議是深受好評,即使不是關於這個問題。謝謝!

回答

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; 
} 
} 

如果字符串不允許只用你的字符數組。你的輸入格式似乎沒有錯。

如果矢量不允許任何,那麼你可以創建基於最終大小字符指針的初始化。

例如:

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]; 

... 

然後,只需填寫resultat。

希望有幫助!

+0

嘗試,沒有cin.get();它不工作。初始化後。感謝提示,但結果是一樣的。 – user4749795

+0

我正在調查你的循環。很快就會回來! –

+0

謝謝,我讚賞 – user4749795

0

你是否必須使用多個數組來完成它?您只能執行指定輸入的開關盒。由於您將數字10-19替換爲字母A-J,因此您可以在切換情況下輕鬆實現此功能。您也可以檢查不正確的輸入。

如果你必須使用數組,第一個問題是爲什麼你的數組數組的單個數字?這是約束嗎?你不能使用:

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

爲數組而不是,這樣你可以引用數組索引並使用索引代替它?這樣,你可以通過使用索引引用來替換基於索引的輸出來補充數組,例如A是索引1,用於字母數組,它指的是數值數組的索引1,它是「10」,因此您只需打印數組索引值添加到變量並輸出。