web-dev-qa-db-fra.com

C++ - Comment ajouter un caractère à un caractère *?

J'ai essayé de nombreuses manières sur Internet d'ajouter un caractère à un caractère *, mais aucun ne semble fonctionner. Voici une de mes solutions incomplètes:

char* appendCharToCharArray(char * array, char a)
{
    char* ret = "";
    if (array!="") 
    {
        char * ret = new char[strlen(array) + 1 + 1]; // + 1 char + 1 for null;
        strcpy(ret,array);
    }
    else
    {
        ret = new char[2];
        strcpy(ret,array);
    }

    ret[strlen(array)] = a;  // (1)
    ret[strlen(array)+1] = '\0';
    return ret;
}

Cela ne fonctionne que lorsque le tableau transmis est "" (vide à l'intérieur). Sinon, cela n'aide pas (et j'ai une erreur à (1)). Pourriez-vous m'aider avec ça? Merci beaucoup à l'avance!

11
sonlexqt

Supprimez ces déclarations char * ret dans les blocs if qui masquent la variable ret extérieure. Par conséquent, vous avez une fuite de mémoire et d'autre part, une mémoire non allouée pour ret.

Pour comparer une chaîne de style c, vous devez utiliser strcmp(array,"") et non array!="". Votre code final devrait ressembler à ceci:

char* appendCharToCharArray(char* array, char a)
{
    size_t len = strlen(array);

    char* ret = new char[len+2];

    strcpy(ret, array);    
    ret[len] = a;
    ret[len+1] = '\0';

    return ret;
}

Notez que vous devez gérer la mémoire allouée de ret renvoyée quelque part par delete[]le.

Pourquoi n'utilisez-vous pas std::string ? il a la méthode .append pour ajouter un caractère à la fin d'une chaîne:

std::string str;

str.append('x');
// or
str += x;
13
deepmax

Le nom de la fonction ne reflète pas la sémantique de la fonction. En fait, vous n’ajoutez pas de caractère. Vous créez un nouveau tableau de caractères contenant le tableau d'origine plus le caractère donné. Donc, si vous avez vraiment besoin d’une fonction qui ajoute un caractère à un tableau de caractères, je l’écrirai de la manière suivante

bool AppendCharToCharArray( char *array, size_t n, char c )
{
    size_t sz = std::strlen( array );

    if ( sz + 1 < n ) 
    {
        array[sz] = c;
        array[sz + 1] = '\0';
    }       

    return ( sz + 1 < n );
} 

Si vous avez besoin d’une fonction qui contiendra une copie du tableau d’origine plus le caractère donné, l’apparence suivante pourrait vous être donnée

char * CharArrayPlusChar( const char *array, char c )
{
    size_t sz = std::strlen( array );
    char *s = new char[sz + 2];

    std::strcpy( s, array );
    s[sz] = c;
    s[sz + 1] = '\0';

    return ( s );
} 
2
Vlad from Moscow

Le problème spécifique est que vous déclarez une nouvelle variable au lieu d’affecter une variable existante:

char * ret = new char[strlen(array) + 1 + 1];
^^^^^^ Remove this

et essayer de comparer les valeurs de chaîne en comparant les pointeurs:

if (array!="")     // Wrong - compares pointer with address of string literal
if (array[0] == 0) // Better - checks for empty string

bien qu'il n'y ait pas besoin de faire cette comparaison du tout; la première branche fera ce qu'il faut, que la chaîne soit vide ou non.

Le problème le plus général est que vous vous amusez avec une mauvaise manipulation de chaînes de style C en C++, source d'erreurs. Utilisez std::string et il gérera toute l’allocation de mémoire pour vous:

std::string appendCharToString(std::string const & s, char a) {
    return s + a;
}
1
Mike Seymour
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;

SORTIE:

test
0
Safa Seed