2009-10-06 6 views
2

Existe-t-il un moyen plus simple de faire ce qui suit dans c?Vérification d'une chaîne pour les caractères corrects dans c

unsigned short check_str(char *str) 
{ 
    while (*str) 
    { 
     if (!(*str == ' ' || *str == '(' || *str == ')' || 
       *str == '1' || *str == '2' || *str == 'a' || 
       *str == 'x' || *str == 'b')) 
       return 0; 
     str++; 
    } 
    return 1; 
} 

En gros, il vérifie une chaîne pour tous les caractères autres que ceux listés et renvoie false s'il en trouve un. Y a-t-il une fonction plus simple?

+1

Vous pourriez vouloir augmenter les paramètres d'avertissement de votre compilateur: vous avez besoin d'un 'return 1;' à la fin de votre fonction pour être correct. –

+0

ahh, ouais je viens de laisser ça sur un accident. – user105033

Répondre

20

Vous voulez que la fonction de la bibliothèque standard strspn:

strspn(str, " *(12axb") == strlen(str); 

Il comptera des personnages dans str jusqu'à ce qu'il voit le premier qui n'est pas l'un des personnages du second argument. Ainsi, s'il ne trouve aucun caractère non-correspondant, il retournera la longueur de la chaîne.

Une manière plus rapide d'écrire la même chose, mais peut-être moins clair, est de vérifier \0 au lieu d'appeler strlen:

str[strspn(str, " *(12axb")] == '\0'; 
+0

Voilà ce que je cherche: D, strpbrk ne fonctionnera pas pour ça. – user105033

+0

+1 J'avais la même idée 'strspn()', mais je n'arrivais pas à trouver comment la rendre efficace. Bon appel à ça. –

+0

+1 bien, monsieur –

0

La réponse de Pavel est certainement ce que vous voulez pour votre problème particulier, mais je pensais J'ajouterais que pour le problème plus général de la validation des caractères, vous pouvez aussi vérifier très facilement les plages de caractères si vos chaînes sont en ASCII. Par exemple:

if (*str >= '0' || *str <= '9') { 
    // *str is a number. 
} 

Ceci peut être utile si vous avez beaucoup de caractères valides dans une plage contiguë. Il existe un certain nombre de fonctions de bibliothèque standard (par exemple, isalpha) qui vérifient les plages communes pour vous.

Questions connexes