2017-04-21 4 views
-2
#include "stdafx.h" 
#include <vector> 
#include <string> 
#include <string.h> 
#include <algorithm> 
#include <iostream> 
using namespace std; 
int len = 10; 
char * strNumber1 = new char[2*len+1]; 
char * strNumber2 = new char[2*len+1]; 
int cmp(const char *str1,const char *str2){ 
    strcpy(strNumber1,*(const char**)str1); 
    strcat(strNumber1,*(const char**)str2); 

    strcpy(strNumber2,*(const char**)str2); 
    strcat(strNumber2,*(const char**)str1); 

    return strcmp(strNumber1,strNumber2); 
} 
string PrintMinNumber(vector<int> numbers) { 
    int length = numbers.size(); 

    char **numStr = new char*[10]; 
    for(int i = 0; i < length; i++){ 
     sprintf(numStr[i],"%d",numbers[i]); 
    } 

    sort((char*) numStr[0],(char*)numStr[length],cmp); 
    // I don't know how to pass the char* from char** numStr; 
    string ans = ""; 
    for(int i = 0; i < length; i++){ 
     ans += numStr[i]; 
    } 
    return ans; 
} 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int a[3] = {3,32,321}; 
    vector<int> numbers(a,a+3); 
    cout<<PrintMinNumber(numbers); 
    return 0; 
} 

Ce qui précède est mon code qui est utilisé pour résoudre le problème, qui est de savoir comment obtenir le nombre minimum de tels que 3 321,32. Nous pouvons obtenir le résultat est 321323. Donc j'ai besoin de trier la chaîne, mais je ne sais pas comment passer char * de char** à const char*. Pouvez-vous expliquer ce que je dois faire?Comment passer char * de char ** à const char *

+1

Ne pas spammer les tags. C n'est pas C++ n'est pas C! Puis lisez [demander]. Ce que vous demandez est définitivement faux. – Olaf

Répondre

0

Cette explication à l'amélioration:

Si vous initialiser: char **numStr = new char*[10];
Vous avez en fait déjà 10 tableaux de type char *.

Vous pouvez vous imaginer comme ceci:
numStr = [addressOfChar-0, addressOfChar-1, ..., addressOfChar-9];
Ensuite, pour la fonction de tri, vous pouvez directement remplir BEGIN-index et les paramètres de fin index de Y, comme ci-dessous:
sort(numStr,numStr + length,cmp);

Pour les paramètres de strcpy et strcat en fonction cmp (int cmp(const char *str1,const char *str2)), vous faites pas besoin de diffuser à (const char **). Parce que str1 et str2 sont des éléments de numStr ou d'addressOfChar-N.

Pour strcmp vous devez comparer plus petit que 0, parce que si le retour -1 le résultat est vrai, vous pouvez essayer le code ci-dessous:
bool check = (-1? True: false);

Vous n'oubliez pas delete toutes les variables qui utilisent la mémoire tas (new), car il peut provoquer une fuite mémoire.

#include <vector> 
#include <string> 
#include <cstring> 
#include <algorithm> 
#include <iostream> 
#include <cmath> 
using namespace std; 
int len = 10; 
char * strNumber1 = new char[2*len+1]; 
char * strNumber2 = new char[2*len+1]; 
int cmp(const char *str1,const char *str2){ 
    strcpy(strNumber1,str1); 
    strcat(strNumber1,str2); 

    strcpy(strNumber2,str2); 
    strcat(strNumber2,str1); 
    return strcmp(strNumber1, strNumber2) < 0; 
} 
string PrintMinNumber(vector<int> numbers) { 
    int length = numbers.size(); 
    char **numStr = new char*[10]; 
    for(int i = 0; i < length; i++){ 
     if (numbers[i] == 0) 
     { 
      numStr[i] = new char[2]; 
     } 
     else 
     { 
      numStr[i] = new char[log(numbers[i]) + 2]; 
     } 

     sprintf(numStr[i],"%d",numbers[i]); 
    } 

    sort(numStr,numStr + length,cmp); 
    string ans = ""; 
    for(int i = 0; i < length; i++){ 
     ans += numStr[i]; 
     delete[] numStr[i]; 
    } 
    delete[] numStr; 
    return ans; 
} 
int main() 
{ 
    int a[] = { 321,3,32 }; 
    vector<int> numbers(a,end(a)); 
    cout<<PrintMinNumber(numbers); 
    delete[] strNumber1; 
    delete[] strNumber2; 
    return 0; 
} 
+0

Merci beaucoup, ça fonctionne. Je suis vraiment désolé, je ne peux pas voter. – mHuster