J'essaie d'écrire un programme qui compte tous les personnages d'une chaîne. Je l'avais à l'origine, mais ensuite réalisé que je ne peux pas compter les espaces. Je ne vois pas pourquoi cela ne fonctionne pas. Toute aide appréciée. P> EDIT * Fais-t-il une différence si l'entrée (chaînes) est en cours de numérisation dans celle-ci? Et oui, tout est initialisé. J'ai essayé d'imprimer ce que Z [M] évalue aussi et ce n'est pas la valeur réelle de la chaîne de "M", je pense que c'est le problème. P> 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 ++;
}
}
4 Réponses :
Vous devez initialiser Voici un exemple complet et correct avec des modifications minimales: P> charcant code>. Autre que cela, il devrait fonctionner, à condition que
z code> est une maquette à terminaison zéro de caractères et
m code> est un
int code> ou similaire. J'écrirais probablement juste
z [m] code> plutôt que
z [m]! = 0 code> (puisque! 0 = true et 0 = false), mais les deux fonctionnent. Il existe des moyens plus efficaces de le faire (bien que ces jours-ci, je parie qu'un compilateur gérera la convertir en une boucle basée sur un pointeur pour vous).
const char * z = "testing one two three";
int m;
int charcount;
charcount = 0;
for(m=0; z[m]; m++) {
if(z[m] != ' ') {
charcount ++;
}
}
'\ 0' code> et
0 code> sont les mêmes. L'un n'est pas plus correct que l'autre. On peut peut-être être plus élégant i> que l'autre.
@PMG: Non, ils ne sont pas. '\ 0' code> est un
char code>,
0 code> est un
int code>. C'est une distinction qui ne fait aucune différence dans ce code, cependant.
Essayez ceci: tailleof '\ 0' code>. Je ne pense pas avoir jamais vu un caractère littéral dans
C code> (sauf intérieur
char [] code>).
@PMG: Je parle d'informations de type, pas de la taille du stockage utilisé.
Ce message est pas B> Tagged C ++ code>. J'aurais fait la distinction si c'était.
@PMG: C a des types aussi. Char CODE> et
INT CODE> n'est pas le même, même en C, même si tout compilateur que j'ai jamais vu sera heureux et de promouvoir et de démontrer silencieusement si nécessaire (en particulier avec des constantes) . Cela ne signifie pas qu'ils sont la même chose, et c'est certainement i> ne signifie pas que les programmeurs qui sont clairement un peu nouveaux à cela et qui devraient avoir l'habitude de les traiter comme si elles étaient les même. Je me comprends de cette conversation, n'hésitez pas à avoir le dernier mot.
@pmg: "et '\ 0' code> est un int!" I> Je serais intéressé de voir une référence à ce sujet. Mais encore une fois, laissant le sol à vous. Meilleur.
Re: scanf code>, vous peut i> en fait contrôler la largeur maximale du champ pour
% s code>.
@ T.J.: C99, § 6.4.4.4 2: "Une constante de caractère entier est une séquence d'un ou plusieurs caractères multibytes enfermés dans des guillemets simples, comme dans" x "." § 6.4.4.4 10: "Une constante de caractère entier a le type INT."
Comparez C ++ 03 § 2.13.2 1: "A [N ordinaire] Littéral de caractère est un ou plusieurs caractères enfermés dans des guillemets simples, comme dans" x "[...]. Un littéral de caractère ordinaire qui contient un seul c- Char a type de type, avec valeur égale à la valeur numérique du codage du C-Char dans le jeu de caractères d'exécution. Un littéral de caractère ordinaire contenant plus d'un C-Char est un littéral multicharacter. Un littéral multicharacter a le type INT et valeur définie par la mise en œuvre. "
@PMG: modifié et merci pour l'information. J'écrirais ! Z [m] code> quand même ... :-)
Désolé tout le monde ... Je devais m'éloigner de l'ordinateur pendant un moment. Merci Outtis Code> pour pêcher la référence pour moi et je suis content que ce problème soit réglé.
@ALL: Je supprimerais mes commentaires erronés ci-dessus, mais les autres commentaires sembleraient étranges, alors supposons simplement que les gens sont suffisamment intelligents pour lire tout le chemin ...
Vous pouvez utiliser strallen () code>
Je suggérerais d'utiliser un quelque chose comme ça fonctionnerait P> pendant code> en boucle et d'utiliser des noms de variable plus significatifs p>
Comment SHLEN code> l'aidait-il à savoir combien de caractères non-espace B> sont 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 ligne.
@TJ: scanf code> saute déjà des espaces elle-même et arrête de numériser lorsqu'il atteint l'espace suivant.
@James: comme "r" dit, c'est parce que scanf code> s'arrête sur le premier bit de WhitSpace, comme je l'ai mentionné dans ma réponse modifiée lorsque vous avez modifié votre question pour dire que vous utilisiez
scanf code>.
@R: Aussi de réponse anonyme et mon commentaire, nous ne savions pas scanf code> était impliqué.
Au lieu d'utiliser Scanf, essayez les fgets comme si: fgets va lire une ligne totale em> à partir d'un fichier. En tant que tel, passez à STDIN alors que la poignée du fichier le rendra à partir de l'entrée standard, ce qui sera dans la plupart des cas liés à la console. Une chose à surveiller, cependant, est que la chaîne que vous obtenez de Fgets pourrait inclure le personnage de la nouvelle ligne. Plutôt que de vérifier explicitement vos chaînes pour les inégalités avec le caractère spatial (''), je suggère d'utiliser la fonction Isspace de Ctype.h, qui vérifiera diverses formes de blancheur (y compris un espace régulier et une nouvelle ligne). P> < p> Voici un exemple complet et exécutable: p>
Oui, il y a une différence sur l'entrée-numérisation avec scanf: scanaf ("% s" ...) se casse toujours au caractère spatial, donc votre ou si vous voulez blanc fort> -spaces alors prenez P> #include <ctype.h>
...
if( !isspace(*c) )
Avez-vous initialisé
charcant code> à zéro avant la boucle?
Cela devrait effectivement fonctionner, alors cela ne fonctionne pas (avez-vous un exemple) et êtes-vous sûr qu'il y a des espaces dans le texte et non par ex. onglets?
Pour ajouter à la confussion, veuillez noter qu'un caractère est différent d'un octet et qu'un caractère peut prendre plusieurs octets dans un codage multi-mètres (E.G: UTF-8).
SCANF CODE> SANCHE LES ESPACES SUPPORTS, Donc, vous n'avez pas besoin de si vous utilisez
scanf code>. Mais votre code a un bogue grave en ce sens qu'il ne peut pas assurer
scanef code> n'écrire pas en dehors des limites de
z code>. Vous pouvez utiliser
% 10s code> (ou quelle que soit la longueur de
z code> est, moins 1) au lieu de
% s code> pour résoudre ce problème.