La concaténation d'un caractère dans une chaîne

Je suis en train de lire une chaîne de caractères à partir de la console. Mais je veux le lire char par char. Et je vais avoir des ennuis avec la concaténation du char à la chaîne ET à la rupture de la boucle.
Voici le code:

char* createString(){
    char c;
    char *string;
    int x=0;

    string = (char*) calloc(1, sizeof(char));
    do{
        c = getche();
        if(c != '\n'){
            x++;
            realloc(string, sizeof(char)*x);
            strcat(string, &c);
        };
    }while(c != '\n');
    return string;
};

Lorsque j'exécute ce code, chaque concaténation ajoute 3 caractères au lieu de 1. C'est comme l'est l'accès de la mémoire non alloué... (Par exemple, si je presse a, la chaîne finale est a%T. Alors, si j'appuie sur une autre touche, s par exemple, la chaîne devient a%Ts%T)

Et lorsque j'appuie sur Enter, il va dans le si et de ne pas sortir de la boucle.

Je n'ai aucune idée de pourquoi et ce qui se passe...


MODIFIER


Sur la base d'autres essais et réponses jusqu'à maintenant, j'ai changé mon code et maintenant c'est comme ça:

char* digitarString(){
    char c[2];
    char *string;

    string = (char*) calloc(1, sizeof(char));
    do{
        c[0] = getche();
        c[1] = '
char* digitarString(){
char c[2];
char *string;
string = (char*) calloc(1, sizeof(char));
do{
c[0] = getche();
c[1] = '\0';
if(c[0] != '\n'){
strcat(string, c);
};
}while(c[0] != '\n');
return string;
};
'
; if(c[0] != '\n'){ strcat(string, c); }; }while(c[0] != '\n'); return string; };

MAIS, il y a encore deux questions...

  • Le code fonctionne, mais je pense que c'est l'écriture en mémoire non alloué.
  • Lorsque j'appuie sur Enter cela ne fonctionne toujours pas. Il de garder l'entrée de la boucle et si.

Oublier le Enter... je l'ai changé...

c[0] = getche();

à

scanf("%c", &c[0]);

et a travaillé incroyablement bien.

  • strcat attend pointeurs à 0 à terminaison des tableaux de chars. Vous ne passez pas qui.
  • La mise à jour de code est mal, je le crains. strcat ne pas allouer de la mémoire pour vous afin que vous êtes en train de rédiger une surabondance de la quantité de données à un 1-tableau d'octets. Je suppose que c'est de travailler pour vous, par hasard, probablement parce que votre programme n'a pas allouer plus de mémoire et n'est pas libre string de sorte que vous ne remarquerez la corruption de la mémoire.
  • Oui, j'ai peur de ça aussi. En fait, je pense que ce qui se passe réellement... connaissez-vous une façon d'éviter ce problème?
InformationsquelleAutor Bestknighter | 2013-05-20