0
votes

c ++ Créer un tableau de caractères à partir d'une chaîne variable passée en tant que paramètre de fonction

Je veux créer un tableau de caractères dans une fonction à partir d'une chaîne que j'ai transmise.

 "Initialization with '{...}' expected for aggregate object."

Mais je suis rencontré

bool foo(string s1, string s2) {
    char s1_char_array[] = s1;
    char s2_char_array[] = s2;
}

Pour les deux déclarations.

J'ai essayé beaucoup de contournements, mais ils ont tous leurs propres erreurs. L'apprentissage du C ++ et de chaque tutoriel que je trouve a la valeur codée en dur. Comment faire fonctionner cela?


2 commentaires

Vous pouvez créer un char* que vous allouez avec new[] mais pas avec char[] car vous auriez besoin de connaître la taille de la chaîne au moment de la compilation. N'oubliez pas que les tableaux en c ++ doivent avoir une taille fixe au moment de la compilation. De plus, la partie = ne fonctionnera pour aucun de ces éléments.


Pourquoi voulez-vous les tableaux? L'utilisation directe des éléments de std::string (via l' operator[] ) ne fonctionnera-t-elle pas? Que diriez-vous d'utiliser std::vector ou un autre std::string si des copies de données sont nécessaires?


3 Réponses :


1
votes

La mauvaise nouvelle est qu'il n'y a aucun moyen de créer une variable tableau à partir d'un std::string en général car std::string peut représenter des chaînes de toute taille (de très grandes limites pratiques existent mais vous manquerez de mémoire d'abord sur 64 systèmes de bits) et cette taille est dynamique, c'est-à-dire déterminée au moment de l'exécution. En revanche, la taille d'un tableau doit être connue au moment de la compilation, moment auquel la taille de la chaîne est toujours inconnue.

Un autre problème est que vos baies disposent d'un stockage automatique et que la mémoire disponible pour le stockage automatique est très limitée - généralement un à quelques mégaoctets sur les postes de travail / serveurs; potentiellement beaucoup moins sur embarqué - alors que la mémoire dynamique détenue par la chaîne n'a pas une telle restriction et ainsi tenter de placer une grande chaîne dans le stockage automatique pourrait facilement provoquer un «débordement de pile».

Un autre problème est que les tableaux ne peuvent pas être char s1_char_array[] = some_variable; ni convertis à partir d'autres types donc char s1_char_array[] = some_variable; ne peut jamais fonctionner.


La bonne nouvelle est que vous n'avez jamais besoin de faire cela non plus. std::string contient déjà un tableau de char s en interne, donc il n'y a pas besoin de créer un nouveau tableau. Continuez simplement à utiliser le tableau qui se trouve dans la chaîne.


0 commentaires

1
votes

Vous pouvez allouer dynamiquement des tableaux et y copier des données à partir des chaînes.

#include <string>
#include <cstring> // for strcpy()
#include <algorithm> // for std::copy()
using std::string;

bool foo(string s1, string s2) {
    // allocate arrays (+1 for terminating null-characters)
    char* s1_char_array = new char[s1.size() + 1];
    char* s2_char_array = new char[s2.size() + 1];
    // copy data to arrays
#if 0
    // if the strings are guaranteed not to contain '\0'
    strcpy(s1_char_array, s1.c_str());
    strcpy(s2_char_array, s2.c_str());
#else
    // if the strings may contain '\0'
    std::copy(s1.begin(), s1.end(), s1_char_array);
    std::copy(s2.begin(), s2.end(), s2_char_array);
    s1_char_array[s1.size()] = '\0';
    s2_char_array[s2.size()] = '\0';
#endif
    
    // do things with the arrays

    // deallocate the arrays
    delete[] s1_char_array;
    delete[] s2_char_array;
    // return something
    return false;
}


0 commentaires

0
votes

c'est ce que je propose. vous devez déclarer la taille du tableau de caractères identique à celle des chaînes en utilisant la fonction string.lenght() et

puis utilisez des boucles pour copier les éléments de chaînes dans le tableau de caractères index par index

bool foo(string s1, string s2) {
    
    char s1_char_array[s1.length()] ;
    char s2_char_array[s2.length()] ;
    for(int i=0; i<s1.length(); i++){
        s1_char_array[i]=s1[i];
    }
    for(int i=0; i<s2.length(); i++){
        s2_char_array[i]=s1[i];
    }
}


0 commentaires