6
votes

Compter des personnages en C

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. XXX PRE>

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 commentaires

Avez-vous initialisé charcant à 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 SANCHE LES ESPACES SUPPORTS, Donc, vous n'avez pas besoin de si vous utilisez scanf . Mais votre code a un bogue grave en ce sens qu'il ne peut pas assurer scanef n'écrire pas 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.


4 Réponses :


8
votes

Vous devez initialiser 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).

Voici un exemple complet et correct avec des modifications minimales: P>

const char * z = "testing one two three";
int m;
int charcount;

charcount = 0;
for(m=0; z[m]; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}


13 commentaires

'\ 0' et 0 sont les mêmes. L'un n'est pas plus correct que l'autre. On peut peut-être être plus élégant que l'autre.


@PMG: Non, ils ne sont pas. '\ 0' est un char , 0 est un int . C'est une distinction qui ne fait aucune différence dans ce code, cependant.


Essayez ceci: tailleof '\ 0' . Je ne pense pas avoir jamais vu un caractère littéral dans C (sauf intérieur char [] ).


@PMG: Je parle d'informations de type, pas de la taille du stockage utilisé.


Ce message est pas Tagged C ++ . J'aurais fait la distinction si c'était.


@PMG: C a des types aussi. Char et INT 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 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' est un int!" Je serais intéressé de voir une référence à ce sujet. Mais encore une fois, laissant le sol à vous. Meilleur.


Re: scanf , vous peut en fait contrôler la largeur maximale du champ pour % s .


@ 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] quand même ... :-)


Désolé tout le monde ... Je devais m'éloigner de l'ordinateur pendant un moment. Merci Outtis 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 ...



4
votes

Vous pouvez utiliser strallen ()

Je suggérerais d'utiliser un pendant en boucle et d'utiliser des noms de variable plus significatifs xxx

quelque chose comme ça fonctionnerait xxx


5 commentaires

Comment SHLEN l'aidait-il à savoir combien de caractères non-espace 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 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 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 .


@R: Aussi de réponse anonyme et mon commentaire, nous ne savions pas scanf était impliqué.



2
votes

Au lieu d'utiliser Scanf, essayez les fgets comme si: xxx

fgets va lire une ligne totale à 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> Voici un exemple complet et exécutable: xxx


0 commentaires

0
votes

Oui, il y a une différence sur l'entrée-numérisation avec scanf: xxx pré>

scanaf ("% s" ...) se casse toujours au caractère spatial, donc votre si est vrai fort>. Mieux vous utilisez des fgets à lire à partir de stdin, p> xxx pré>

ou si vous voulez blanc fort> -spaces alors prenez P>

#include <ctype.h>
...
if( !isspace(*c) )


0 commentaires