50 votes

En C - Vérifier si un caractère existe dans un tableau de caractères.

J'essaie de vérifier si un caractère appartient à une liste/un tableau de caractères invalides.

Comme je viens d'un milieu python, j'avais l'habitude de pouvoir dire :

for c in string:
    if c in invalid_characters:
        #do stuff, etc

Comment puis-je faire cela avec des tableaux de caractères C ordinaires ?

49voto

Jonathan Leffler Points 299946

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).

5 votes

C'est incroyable le nombre de personnes qui ont suggéré strchr ¡! strpbrk est clairement la solution idéale.

1 votes

Cela devrait en fait être la réponse acceptée ! C n'est pas entièrement sans piles...

0 votes

Dans votre description de strpbrk any character from the string pointed to by s2 mais dans votre exemple, vous testez contre "invalid" . Cela ne va-t-il pas rechercher toute occurrence de n'importe quel caractère individuel dans la chaîne de caractères ? "invalid" ?

33voto

RichieHindle Points 98544

Le code C équivalent ressemble à ceci :

#include <stdio.h>
#include <string.h>

// This code outputs: h is in "This is my test string"
int main(int argc, char* argv[])
{
   const char *invalid_characters = "hz";
   char *mystring = "This is my test string";
   char *c = mystring;
   while (*c)
   {
       if (strchr(invalid_characters, *c))
       {
          printf("%c is in \"%s\"\n", *c, mystring);
       }

       c++;
   }

   return 0;
}

Notez que invalid_characters est une chaîne de caractères C, c'est-à-dire une chaîne de caractères à terminaison nulle. char le tableau.

3 votes

J'essaie de ne pas être pointilleux, mais si c'est en C, ne devriez-vous pas remplacer std::cout par l'appel printf() équivalent ? Ou au moins quelque chose qui existe en C ?

2 votes

Bien que cette boucle utilisant strchr() fonctionne, je pense qu'il est préférable d'utiliser 'strcspn()' ou strpbrk() sans la boucle dans le code utilisateur.

0 votes

@Jonathan : Vous avez raison, mais j'ai gardé le code similaire au Python original de l'OP, et répondu à la question "vérifier si un char existe dans un tableau de chars".

28voto

Dave Rigby Points 5375

En supposant que votre entrée est une chaîne C standard à terminaison nulle, vous voulez utiliser strchr :

#include <string.h>

char* foo = "abcdefghijkl";
if (strchr(foo, 'a') != NULL)
{
  // do stuff
}

Si, en revanche, votre tableau n'est pas à terminaison nulle (c'est-à-dire s'il ne s'agit que de données brutes), vous devrez utiliser la fonction memchr et fournir une taille :

#include <string.h>

char foo[] = { 'a', 'b', 'c', 'd', 'e' }; // note last element isn't '\0'
if (memchr(foo, 'a', sizeof(foo)))
{
  // do stuff
}

5voto

Tom Points 16783

Utiliser la fonction strchr pour traiter les chaînes de caractères C.

const char * strchr ( const char * str, int character );

Voici un exemple de ce que vous voulez faire.

/* strchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char invalids[] = ".@<>#";
  char * pch;
  pch=strchr(invalids,'s');//is s an invalid character?
  if (pch!=NULL)
  {
    printf ("Invalid character");
  }
  else 
  {
     printf("Valid character");
  } 
  return 0;
}

Utilisez memchr lorsque vous traitez des blocs de mémoire (et non des tableaux à terminaison nulle).

const void * memchr ( const void * ptr, int value, size_t num );

/* memchr example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char * pch;
  char invalids[] = "@<>#";
  pch = (char*) memchr (invalids, 'p', strlen(invalids));
  if (pch!=NULL)
    printf (p is an invalid character);
  else
    printf ("p valid character.\n");
  return 0;
}

http://www.cplusplus.com/reference/clibrary/cstring/memchr/

http://www.cplusplus.com/reference/clibrary/cstring/strchr/

4voto

Keith Smith Points 1724

Vous voulez

strchr (const char *s, int c)

Si le caractère c est dans la chaîne s il retourne un pointeur vers l'emplacement dans s. Sinon il retourne NULL. Donc, utilisez simplement votre liste de caractères invalides comme chaîne de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X