Comptage de caractères en C
Je suis en train d'écrire un programme qui compte tous les caractères dans une chaîne. J'ai d'abord eu, mais alors réalisé que je ne peux pas compter les espaces. Je ne vois pas pourquoi cela ne fonctionne pas.
for(m=0; z[m] != 0; m++) {
if(z[m] != ' ') {
charcount ++;
}
}
Toute aide appréciée.
Edit* Fait-il une différence si l'entrée(les chaînes) sont en cours de numérisation dans ce genre? Et oui, tout est initialisé. J'ai essayé l'impression que z[m] évalue aussi, et ce n'est pas la valeur réelle de la chaîne à "m", je pense que c'est le problème.
for(j=0; j<7; j++){
printf("Enter a string:\n");
scanf("%s", z);
for(m=0; z[m] != 0; m++){
if(z[m] != ' '){
charcount ++;
}
}
Avez-vous initialiser
Qui devrait, en effet, de travail, de sorte qu'il ne fonctionne pas (vous avez par exemple ) Et vous êtes sûr il y a des espaces dans le texte, et non pas par exemple les onglets ?
Pour ajouter à la confussion, veuillez noter qu'un personnage est différent d'un octet, un personnage peut prendre plusieurs octets dans un encodage multi-octets (e.g: UTF-8)
charcount
à zéro avant la boucle?Qui devrait, en effet, de travail, de sorte qu'il ne fonctionne pas (vous avez par exemple ) Et vous êtes sûr il y a des espaces dans le texte, et non pas par exemple les onglets ?
Pour ajouter à la confussion, veuillez noter qu'un personnage est différent d'un octet, un personnage peut prendre plusieurs octets dans un encodage multi-octets (e.g: UTF-8)
scanf
lui-même ignore les espaces, si vous n'en avez pas besoin si vous utilisez scanf
. Mais votre code a un sérieux problème en ce qu'elle ne peut pas assurer scanf
ne pas écrire en dehors des limites de z
. Vous pouvez utiliser %10s
(ou quelle que soit la longueur de z
est, moins 1) au lieu de %s
pour résoudre ce problème.
OriginalL'auteur James | 2010-09-19
Vous devez vous connecter pour publier un commentaire.
Vous devez initialiser
charcount
. Autre que cela, il doit travailler, à condition quez
zéro est terminée par le tableau de caractères etm
est unint
ou similaire. Je serais probablement écrire justez[m]
plutôt quez[m] != 0
(depuis !0 = true et 0 = faux), mais les deux travaux. Il y a des moyens plus efficaces de le faire (bien que ces jours, je pari un compilateur de gérer la conversion en un pointeur de boucles pour vous).Voici une complète, correcte exemple avec un minimum de modifications:
Si vous utilisez un
String
classe d'un genre plutôt qu'un old-fashioned C null tableau, vous aurez envie de regarder cette catégorie pour comment faire une boucle à travers elle.Tous les ci-dessus suppose également que vous avez à traiter avec des chaînes ASCII. Si vous faites affaire avec de l'UTF-encodées, vous avez à gérer des caractères multi-octets.
Re votre edit: Ça fait une grosse différence:
scanf
sera s'arrêter sur le premier vide (j'avais oublié). Il pourrait faire une différence encore plus importante que cela, cependant, si vous n'êtes pas déclarerz
correctement. (Je recommande aussi à l'aide d'une largeur de champ lors de l'utilisation descanf
pour la lecture des cordes [ou d'éviterscanf
entièrement]; sinon, vous n'avez aucun contrôle sur le nombre de caractères qu'il va essayer de magasin, et en théorie, aucun tampon ne sera jamais assez grand pour éviter un débordement. Plus ici: http://www.crasseux.com/books/ctutorial/String-overflows-with-scanf.html)'\0'
et0
sont les mêmes. L'un n'est pas plus correct que les autres. On peut, peut-être, être plus élégant que les autres.Non, ils ne le sont pas.
'\0'
est unchar
,0
est unint
. C'est une distinction qui ne fait pas de différence dans ce code.Essayez ceci:
sizeof '\0'
. Je ne pense pas que j'ai jamais vu un littéral char dansC
(sauf à l'intérieurchar[]
).Ce post est PAS tagged
C++
. J'aurais fait la distinction, si elle l'avait fait.C99, § 6.4.4.4 2: "Un nombre entier de caractères constante est une séquence d'un ou de plusieurs caractères multioctets enfermés dans des guillemets simples, comme dans "x"." § 6.4.4.4 10: "Un nombre entier de caractères constante de type int."
OriginalL'auteur T.J. Crowder
Vous pouvez utiliser
strlen()
Je suggérerais à l'aide d'un
while
boucle, et l'utilisation de plus de sens des noms de variablesQuelque chose comme ce serait le travail
strlen
aider à savoir combien de non-espace caractères dans la chaîne?strlen() serait utile pour moi, sauf qu'il semble imprimer la longueur de chaque mot individuellement, plutôt que sur une seule ligne.
ignore les espaces déjà en lui-même, et la numérisation s'arrête lorsqu'il atteint l'espace suivant.
"R", déclare, c'est parce que
scanf
s'arrête sur le premier bit d'espaces, comme je l'ai mentionné dans mon édité répondre lorsque vous avez édité votre question de dire que vous étiez à l'aide descanf
.De Anonyme " réponse et mon commentaire, nous ne savions pas
scanf
a été impliqué.OriginalL'auteur Anonymous
Au lieu d'utiliser scanf, essayez de fgets comme suit:
fgets va lire un ensemble ligne à partir d'un fichier. En tant que tel, en passant stdin que le descripteur de fichier permettra de faire lire l'entrée standard, dans la plupart des cas être lié à la console. Une chose à surveiller, cependant, est que la chaîne que vous obtenez à partir de fgets peut inclure le caractère de saut de ligne. Plutôt que d'être explicitement la vérification de vos chaînes pour inégalité de traitement avec le caractère espace (' '), je suggère d'utiliser le isspace fonction de ctype.h, qui va vérifier les différentes formes d'espaces (y compris un espace normal et saut de ligne).
Ici est un complet, runnable exemple:
OriginalL'auteur Martin Törnwall
Oui, il y a une différence sur l'entrée-scan avec scanf:
scanf("%s"...) toujours des pauses à l'espace-personnage, donc votre si jamais c'est vrai. Mieux vous utiliser fgets pour lire à partir de stdin,
Ou si vous voulez BLANC -espaces puis prendre
OriginalL'auteur user411313