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 dechar
s. 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 librestring
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?
Vous devez vous connecter pour publier un commentaire.
Ok, voici la solution
de changer cela pour
maintenant la réponse à la question pourquoi ?
eh bien d'abord d'appeler la déclaration ci-dessous
analyse une valeur pour nous et la place dans la variable c
maintenant, considérons la variable est placée dans l'arbitraire d'un emplacement de mémoire x
maintenant à la prochaine déclaration importante
le deuxième argument ci-dessus est censé être une chaîne de caractères signifie une terminaison NULL à la fin, mais nous ne pouvons pas garantir que x+1 localisation est NULLE et si x+1 est non NUL, la chaîne ne sera plus qu'un seul caractère de long et il va finir en ajoutant tous les caractères de votre chaîne d'origine donc les ordures.
J'espère que c'est clair maintenant...
P. S si vous avez accès à gdb vous pouvez vérifier pratiquement..
1) vous devez les initialiser
2) vous devez mettre à jour cette ligne:
à
3) Yoou n'avez pas besoin de strcat à concaténer. Donc, au lieu d'utiliser
utilisez les lignes suivantes