Fonte de char à char tableau ou tableau de char en char?
Donc, disons que j'ai un char et je veux strcat() pour un char tableau dans une seule ligne de code. Pour [une non-pratique] exemple:
strcat("ljsdflusdfg",getchar());
Ou je voulais faire l'inverse, ce serait la fonction concat ou transtypage de chaînes, quel que soit le type de données? Ou peut-être il ya certains de la syntaxe, je suis en manque...
Voici un exemple. Il compile très bien, mais se bloque.
char* input(){
char* inp="";
while(1){
char c=getchar();
if(c){
if(c=='\n'||c==EOF){
break;
}else{
strcat(inp,(char*)c);
}
}
}
return inp;
}
OriginalL'auteur | 2011-01-14
Vous devez vous connecter pour publier un commentaire.
strcat
traite son argument est un pointeur vers un nul de terminaison de chaîne. Le moulage d'unchar
à unchar *
est juste dangereux, et je ne peux imaginer aucune raison de ne jamais être utile (ne signifie pas que vous êtes stupide pour essayer - tout le monde fait des erreurs stupides quand ils apprennent. C'est pourquoi nous sommes ici.)La raison en est qu'elle interpréterait le seul octet
char
, ainsi que les extrasizeof(char*) - sizeof(char)
(généralement 3) octets environnantes quichar
, comme un pointeur, ce qui serait le point de... n'importe où. Vous n'avez aucun moyen de savoir d'où il points de, depuis 3 de ces octets sont hors de votre contrôle, et donc aucun moyen de savoir si c'points de données valides.Vous pouvez prendre cela comme une deuxième approche:
Ce temps, vous feriez mieux, depuis
&c
est une expression de typechar *
et pas de castes sont nécessaires. Mais encore une fois,strcat
suppose que c'est l'argument est nul de terminaison de chaîne, et puisque vous n'avez aucun moyen de garantir un octet nul après votrechar
de données, ce n'est pas cela.La meilleure façon de le faire:
Mise à JOUR:
En fait, j'ai menti. Le meilleur façon est d'utiliser la bibliothèque standard de la fonction
fgets
, qui semble faire plus ou moins ce que vous essayez de faire. Honnêtement je l'ai oublié, mais si c'est un devoir à la maison de votre professeur ne peut pas vous voulez à l'aide defgets
de sorte que vous pouvez apprendre comment le faire manuellement. Toutefois, si ce n'est pas de devoirs,fgets
fait exactement ce que vous cherchez. (En fait, la troisième approche est bien sur son chemin à réimplanterfgets
oufgets
-comme fonctionnalité.)Je voudrais également ajouter d'autres commentaires sur votre
input
fonction:char* inp = "";
aura point de données en lecture seule. Une faille dans le C standard (pour la rétro compatibilité) permet de littéraux de chaîne pour être affecté àchar*
plutôt les types deconst char *
types comme ça (à mon humble avis) devraient l'être.Il y a plusieurs façons d'aborder cette, mais le mieux est de l'allocation dynamique. Utiliser le
malloc
fonction de réserve de certaines données, de garder trace de combien vous avez utilisé dans votre fonction et l'utilisation durealloc
fonction si vous avez besoins de plus d'espace pour les stocker. Si vous avez besoin d'aide avec ça, je suis sûr que vous serez de retour ici (j'espère ne pas trop bientôt) avec une autre question. 🙂getchar()
retourne unint
, parce queEOF
est définie à l'extérieur de l'intervalle normal d'unechar
. Afin de bien distinguer entre leschar
etEOF
, il est préférable de fairec
unint
. Sinon un bon caractère pourrait être le signal d'EOF
. Assurez-vous de jeterc
vers le bas pour unchar
lorsque vous l'ajoutez à la chaîne de caractères.L'autre solution est la solution. Le
&c
version est incorrecte pour la même raison(char *)c
est. Si vous pensez que l'autre version est trop de code, bienvenue à la programmation en C. 😛 (en Fait, il y a une quatrième voie, mais je ne suis pas sûr de savoir si ou non ce qui est des devoirs, et je ne veux pas risquer de faire vos devoirs pour vous, donc je suis égaré sur le côté de la prudence.)Ce n'est pas de devoirs. J'essaie de comprendre C pour mon propre intérêt, mais je n'ai pas beaucoup de temps sur mes mains, et je trouve que le processus atroce. Quelle est la quatrième?
J'ai édité ma réponse. (Et ne vous inquiétez pas, je suis passé par le même processus. Il ne fera pas de sens pour quelques mois, et puis un jour, vous l'aurez, et tout sera en descente à partir de là.)
Merci pour le pointeur, je vais regarder dans fgets. Je ne connaissais pas ma fonction d'entrée était si mauvais. Sur votre point 1 - je ne suis pas concerné avec des dépassements de la mémoire tampon, et je ne sais pas comment déclarer ce qui dans d'autres langues pourrait être appelé une "chaîne de longueur fixe", et je ne veux pas apprendre malloc sauf si c'est la chaîne de longueur fixe de la déclaration de la fonction, je suis à la recherche pour. Sur le point 2 - j'ai pensé que getchar retourne un type de données char, qui est un octet.
OriginalL'auteur Chris Lutz
Qui essaie de concat le contenu de la mémoire à l'endroit où " c " (comme un emplacement de mémoire) est jusqu'à ce qu'il trouve un zéro.
Une meilleure façon est de créer une chaîne vide quelle que soit la taille maximale que vous pensez est raisonnable, le remplir avec des zéros et puis il suffit d'insérer " c " au cours de la dernière position
c
points (lors de la coulée jusqu'à un pointeur).&c
est oùc
est stocké. Mais +1 pour le mieux.C'est ce que je voulais dire, j'ai été en essayant d'éviter le pointeur de la parole - mais la lecture de elle une elle aurait pu être formulé de mieux, merci.
Si je n'avais pas de +1 ed-vous déjà ce que je ferais. En évitant le P-mot est probablement une bonne politique lors du démarrage avec C.
OriginalL'auteur Martin Beckett
Si vous voulez concaténer un seul
char
sur une chaîne, vous pouvez utiliserstrncat()
et spécifier le nombre de caractères à concaténer comme1
. Mais notez que:char
objet de prendre l'adresse du (de sorte que vous ne pouvez pas directement concaténer le résultat degetchar()
.Par exemple:
En C99, vous pouvez utiliser un littéral composé et la deuxième restriction ne s'applique pas:
OriginalL'auteur caf
Cela ne marchera pas, parce que le *inp pointeur de char n'a aucun souvenir de la sauvegarder. Lorsque vous avez déclaré char *inp = "";, vous ne lui a donné l'adresse d'une chaîne vide. Si on avait donné la déclaration suivante char *inp = "abcdefg", alors vous pourriez avoir écrit 7 caractères avant de vous a remplacé le '\0' et eu des ennuis.
Vous aurez besoin d'augmenter dynamiquement la taille de la sauvegarde de la mémoire que vous avez entrée de plus en plus et les personnages. Vous aurez également le problème de savoir quand il faut libérer la mémoire afin que vous n'obtenez pas de fuites de mémoire.
Aussi, votre strcat besoin d'avoir le '&' devant la c.
Si il avait donné
char *inp = "abcdefg";
il ne pouvait pas avoir écrit aucun données en toute sécurité de la chaîne - c'est dans la mémoire en lecture seule.Ce n'est pas vraiment vrai. Sur certains systèmes, oui, mais pas à l'échelle mondiale.
Aussi Anonyme - char xyz[50]; memset((void *)xyz, 0, 50); ou n'importe quelle longueur que vous souhaitez. Si le tableau est déclaré globalement, c'est une convention qu'il seront tous remis à zéro. Toutefois, certaines options du compilateur va écrire un mauvais modèle dans l'espace de sorte que vous pouvez vérifier pour un usage inadéquat.
OriginalL'auteur No One in Particular
Tout d'abord, vous êtes en retournant un pointeur vers une pile allouée tableau. Ce comportement est indéfini. Ensuite, vous essayez d'écrire des caractères dans la mémoire non allouée. Troisièmement, le type de
inp
estconst char*
paschar*
.Vous voulez quelque chose comme:
inp
est valide, bien que si vous avez dit que le type doit êtreconst char*
je ne discute pas du tout. 4. Votre fonction est tout aussi dangereux, si ce n'est plus, comme il n'a pas de limites de contrôle (beaucoup plus difficile d'erreur à la place). Si vous souhaitez que l'utilisateur passe dans leur propre zone tampon, les faire passer dans leur propre longueur.char *inp = ""
devrait être de la mémoire sur la pile. avec certains d'optimisation être mis en stockage global, en supposant globale de stockage EXISTE sur l'architecture, il a la compilation. 2. inp+1 n'est pas explicite alloué par la fonction. 3. Le type doit êtreconst char *
. La seule raison pour laquelle il n'est pas d'obtenir une erreur est parce qu'il est à l'aide d'un standard d'héritage. 4. Alors que ma fonction est dangereux, c'est pas plusstrcat
ou le reste destring.h
.OriginalL'auteur KitsuneYMG
Votre code se bloque en raison de strcat attend null cordes pour deux de ses paramètres.
Si vous voulez concaténer un char, vous devez d'abord créer une chaîne se terminant par null.
Mais ne pas utiliser strcat, sauf si vous pouvez garantir que la chaîne d'entrée a alloué un espace pour que plus de caractère. Mieux pour vous strncat qui comprend également un paramètre de l'espace que dans le premier paramètre (dest).
Je recommande la lecture de cette premier.
OriginalL'auteur sinelaw
Un moyen simple est d'utiliser snprintf:
C'est une solution simple, mais exige que vous avez environ connaissons la taille de la chaîne va être à l'avance.
Note: j'utilise le +1 pour me rappeler qu'il doit y avoir de la place pour la fin null, et snprintf est mieux que sprintf que c'est compte tenu de la taille de la mémoire tampon pour empêcher la saturation de la mémoire tampon.
OriginalL'auteur Daniel
Fonte de char à char tableau?
C'est comme de dire que vous voulez jeter un char en string.
Vous ne pouvez pas le faire directement.
Au lieu de char, le placer dans un tableau (myChar[]).
Après quoi, strcat avec l'original de votre char tableau.
strcat
de travail.j'ai enlever une déclaration de ma réponse pour le rendre correct. Merci pour me rappeler à l'ordre 0 de la chose.
Je n'ai pas downvote (j'étais sur le point, mais là vous avez corrigé), mais alors que vous l'avez fait correct, vous n'avez pas exactement fait clair ou utile. Quelqu'un qui sait C peut dire c'est bon, mais quelqu'un qui ne comprend pas pourquoi le moulage d'un
char
à unchar *
ne fonctionne pas ne pas comprendre pourquoi le moulage d'unchar
à une chaîne ne fonctionne pas. Vous venez de dire une tautologie.OriginalL'auteur Neilvert Noval