Comptage du nombre d'occurrences d'un caractère dans une chaîne de caractères en C
J'ai la chaîne str
char *str = "100.10b.100.100";
Je veux compter les occurrences de '.'
dans str
, de préférence un one-liner. (Si possible, pas de boucles)
Mon approche serait la norme strchr
:
int i = 0;
char *pch=strchr(str,'.');
while (pch!=NULL) {
i++;
pch=strchr(pch+1,'.');
}
- Pour le mantra sac - qu'avez-vous essayé? ce qui ne fonctionne pas? .......
- J'ai posté mon approche.
- Comme tvanfosson souligné, vous pouvez le faire avec la récursivité, et c'est peut-être ce que le professeur voulait vous voir faire, mais c'est complètement idiot de le faire. Il en résulte d'un débordement de pile assez grande pour les chaînes... et pas le bon type de SORTE que votre travail à la maison pour vous, le mauvais genre! 😉
Vous devez vous connecter pour publier un commentaire.
Voici la façon dont je le ferais (nombre minimal de variables nécessaires):
s
oui
selon ques[i]
est un'.'
ou pas. L'expressions+i
toujours augmente de 1 à chaque itération, mais il pourrait être le compteur (i
) ou le pointeur de la base (s
) qui provoques+i
d'augmenter.int i; char *s
:pointer/integer type mismatch in conditional expression
s[i]
às[i] != '\0'
pour plus de clarté.(s[i] != '\0') != 0
pour plus de clarté? 😉*s++
==*(s++)
, pas(*s)++
.) Mais si vous êtes attachés à une seule ligne, il est nécessaire de satisfaire le compilateur.i
ets
.Look, ma, pas de boucles.
Mais, j'avais en fait utiliser une boucle, puisque c'est de la bonne structure de contrôle à utiliser.
|
est censé être un:
. Aussi, "pas de boucles" c'est sympa, mais ce n'est pas exactement comme lisible, ni facile à gérer comme une boucle, et ça ne va pas être plus rapide soit. (Si elle ne peut pas être plus lente, grâce à la queue de la récursivité.) Astucieux code n'est pas toujours bon code, surtout quand il dissimule sens.return countChars(s + 1, c) + *s == c;
.*s==c
entre parenthèses.+
a une priorité plus élevée que==
, évidemment.int
par la norme? (C'est la façon dont il est défini, non? Il n'est pas défini pour le retour de toutbool
type C89 n'a pas de j'espère que.) Aussi, l'utilisation du conditionnel dans votre version abrégée est faux! Il devrait être*s == '\0'
, pass == '\0'
. @R.. - oh pinaise!int countChars(char *s, char c) { return (s = strchr(s, c)) ? countChars(s + 1, c) + 1 : 0 }
OK, un non-boucle de mise en œuvre (et oui, il est conçu comme une blague).
nCount += ( s[88]==c);
. Vous devriez avoir écrit un générateur de code C qui a appelécc
viasystem
pour produire le résultat final. Ou encore mieux, un circuit générateur de code pour éviter les boucles dans le générateur de code.Sans boucle va être dur car il n'y a pas de norme en fonction de la bibliothèque C qui fait cela, et vous avez besoin de regarder tous les caractères 🙂
Je vais prendre la solution la plus évidente:
Hésitez pas à serrer les deux lignes de code dans une si vous en avez:) de
for (i=0; s[i]; s[i]=='.' ? i++ : s++);
Je serais encore de se débarrasser de cette dans une fonction de paramétrage de la chaîne source et le caractère à rechercher.
Si vous êtes désireux sur un one-liner (enfin, deux):
for (size_t i=0; s[i] || printf("%d\n", i)>INT_MAX; s[i]=='.'?i++:s++);
😉//Je suppose que cela devrait fonctionner. Une ligne et pas de boucle.
La seule façon de le faire sans une boucle de récursivité. Ce qui suit est inclus pour le fun, mais est PAS recommandé comme une solution:
Je n'aime pas goto,encore,
chaque fois que vous exécutez ce code de bébé dijkstra pleure 🙂
one line (if possible no loops)
demandé!