IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

conversion AnsiString en Char*


Sujet :

C++Builder

  1. #1
    Débutant
    Inscrit en
    Février 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 105
    Points : 20
    Points
    20
    Par défaut conversion AnsiString en Char*
    bjour , je cherche comment je converti une variable AnsiString en Char* .
    voila mon code et merci d'avance.
    si quelqu'un a une autre astuce voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    void __fastcall TForm4::RzRapidFireButton3Click(TObject *Sender)
    {
    using namespace std;  int b;   char c1[1000], c2[1000], *tmp1, *tmp2, *dep, *arr;
        int nbr = 0;      char ligne_lue[999];
    FILE * f; FILE * f1;   FILE * f2; FILE * f21;
      dep="TCP.EXCLUDED_NODES=(192.168.0.1)";
      //arr="TCP.EXCLUDED_NODES=(10.1.17.222)";
     
    Table1->First();
    while (!(Table1->Eof))
    {
    Variant arr=Table1->FieldByName("Nomm")->AsString;
    Table1->Next();
     
    }
    AnsiString txt = VarToStr(arr);
    txt="TCP.EXCLUDED_NODES=("+txt+")";
    arr=txt;
    ShowMessage("lire adresse.");
     
    f = fopen ("C://oracle//ora92//network//admin//sqlnet.ora", "r");
    f1 = fopen ("c://tata.txt", "w");
    ShowMessage("ouvrir fichier.");
        while (fgets(c1,999,f))
        {
            strcpy(c2,"");
            tmp1 = c1;
            while(strlen(tmp1))
            {
                tmp2 = strstr(tmp1, dep);
                if (tmp2)
                {
                    strncat(c2, tmp1, tmp2 - tmp1);
                    strcat(c2, arr);
                    tmp1 += ((tmp2 - tmp1) + strlen(dep));
                    nbr++;
                }
                else
                {
                    strcat(c2, tmp1);
                    tmp1 += strlen(tmp1);
                }
            }
            fputs(c2,f1);
        }
    ShowMessage("copier dans autre fichier");
     
    fclose (f); fclose (f1);
     
    f21 = fopen ("c://tata.txt", "r");
    f2 = fopen ("C://oracle//ora92//network//admin//sqlnet.ora", "w");
     
     while(fgets(ligne_lue, 999, f21) != NULL){
     
     fprintf(f2, "%s", ligne_lue);
     
      }
      fclose (f2); fclose (f21);
      remove("c://tata.txt");
    ShowMessage("recopier dans original");
    }
    Je réponds à toutes vos questions claires et bien expliquées, si je sais bien sûr.Merci d'avoir pris quelques minutes pour faire bien.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Le code suivant est généralement (presque toujours) incorrect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
      char* dep;
      dep="TCP.EXCLUDED_NODES=(192.168.0.1)";
    // il faut écrire 
      strcpy(dep,"TCP.EXCLUDED_NODES=(192.168.0.1)");
    // il y a de fortes chances que ça provoque un écrasement de mémoire.
    // il faut donc déclarer dep avec une longueur suffisante.
     
    //Autres lignes types
      AnsiString msg=AnsiString(dep); 
      char *arr;
      arr=malloc(msg.Lensth()+1,1);
      strcpy(arr,msg.c_str());
      /* --- */
      free(arr);
    // etc
    L'utilisation de C++ ne dispense pas de connaitre les bases du C
    Voila.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Pour répondre simplement et rapidement, utilise la fonction c_str() qui convertit un string en char* (fonctionne aussi pour les AnsiString).

    Cordialement Thorgal100

  4. #4
    Débutant
    Inscrit en
    Février 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 105
    Points : 20
    Points
    20
    Par défaut
    salut , merci pour la reponse mais cette instruction elle me perd une partie du contenu de la variable.je c pas pourquoi ??. merci d'avance si vous avez la solution ou une autre astuce ?? .merci
    Je réponds à toutes vos questions claires et bien expliquées, si je sais bien sûr.Merci d'avoir pris quelques minutes pour faire bien.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas c_str() qui perd une partie du contenu de la variable, c'est le tableau où vous allez le mettre qui n'est pas assez grand.
    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      AnsiString msg="truc - machin chose";
      char tab[len+1];  // où len est le longueur maximum de la chaine à copier
      strcpy(tab,msg);
    // ou aussi
      char tab[msg.Length()+1];  
      strcpy(tab,msg);
    Ce n'est pas une astuce c'est la bonne manière de faire.

  6. #6
    Débutant
    Inscrit en
    Février 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 105
    Points : 20
    Points
    20
    Par défaut
    salut , merci pour la reponse mais moi j'utilise pas un tableau , j'utilise une variable normale de type char* . merci d'avance .
    Je réponds à toutes vos questions claires et bien expliquées, si je sais bien sûr.Merci d'avoir pris quelques minutes pour faire bien.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par menoran Voir le message
    salut , merci pour la reponse mais moi j'utilise pas un tableau , j'utilise une variable normale de type char* . merci d'avance .
    Ton char* est en fait représenter par un tableau de char dans la mémoire. Revois certainement la notion de pointeur en C.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Une variable du type char* est un pointeur.
    Une chaine de caractères est conservée en mémoire et occupe une place de n octets, plus le zéro terminal que l'on peut appeler par un pointeur sur le premier caractère. C'est un tableau qui doit avoir au moins la dimension n+1.
    Autrement dit,
    char* A; // déclaration
    alors, *A est strictement la même chose que A[0], c'est à dire le premier caractère du tableau A. Vous comprenez que *A contient le premier caractère de la chaine, alors que A, puisqu'il a été déclaré comme pointeur est un pointeur sur chaine.

    Lorsque vous écrivez A=msg.c_str();
    vous attribuez à A la valeur du pointeur de chaine correspondant à msg.
    Si msg = "abcdef", alors
    A[1]='b', un caractère, A[2]='c';
    Mais comme vous n'avez pas réservé explicitement de la place pour le tableau nécessaire à stocker la chaine, vous ne savez pas ce qui se passe ensuite.
    Au lieu de déclarer
    char* A; il faut déclarer char A[N] où N est un nombre, et non une variable, puisque la taille du tableau diot être connu au moment de la compilation.
    Sinon, il y a d'autres solutions, malloc(), new [].
    Ceci naturellement est fondamental.

  9. #9
    Débutant
    Inscrit en
    Février 2010
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 105
    Points : 20
    Points
    20
    Par défaut
    salut , merci mon frere dolez c gentille pour votre reponse enfaite j'ai changé mon prog de telle façon que je n'aurais pas besoin d'une grande taille comme avant et je pense que sa marche .merci encore mon frere.
    Je réponds à toutes vos questions claires et bien expliquées, si je sais bien sûr.Merci d'avoir pris quelques minutes pour faire bien.

Discussions similaires

  1. conversion AnsiString en char*
    Par darkman13130 dans le forum C++Builder
    Réponses: 10
    Dernier message: 18/04/2009, 10h34
  2. conversion AnsiString en const char*
    Par Mangacker dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/05/2007, 18h43
  3. Probleme conversion AnsiString to Char
    Par El-Diablo- dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/05/2007, 09h36
  4. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo