Les fonctions moins connues mais extrêmement utiles (et standard depuis C89 - ce qui signifie 'pour toujours') de la bibliothèque C fournissent ces informations en un seul appel. En fait, il existe de nombreuses fonctions - une véritable mine d'or. Celles qui nous intéressent ici sont les suivantes :
7.21.5.3. La fonction strcspn
Synopsis
#include <string.h>
size_t strcspn(const char *s1, const char *s2);
Description
La fonction strcspn calcule la longueur du segment initial maximal de la chaîne de caractères désignée par s1 qui est entièrement constituée de caractères ne provenant pas de la chaîne désignée par s2.
Renvoie à
La fonction strcspn renvoie la longueur du segment.
7.21.5.4. La fonction strpbrk
Synopsis
#include <string.h>
char *strpbrk(const char *s1, const char *s2);
Description
La fonction strpbrk localise la première occurrence dans la chaîne de caractères pointée par s1 d'un quelconque caractère de la chaîne pointée par s2.
Renvoie à
La fonction strpbrk renvoie un pointeur sur le caractère, ou un pointeur nul si le caractère n'existe pas. de s2 n'apparaît dans s1.
La question porte sur "pour chaque caractère dans la chaîne ... s'il est dans la liste des caractères non valides".
Avec ces fonctions, vous pouvez écrire :
size_t len = strlen(test);
size_t spn = strcspn(test, "invald");
if (spn != len) { ...there's a problem... }
Ou :
if (strpbrk(test, "invald") != 0) { ...there's a problem... }
La meilleure solution dépend de ce que vous voulez faire d'autre. Il y a aussi le strspn()
qui est parfois utile (liste blanche au lieu de liste noire).