2013-10-15 3 views
0

en C++ comment rechercher une partie d'une chaîne à partir de startIndex et se terminant après un certain nombre de caractères. Dans certains cas, j'ai juste besoin de rechercher les 5 premiers caractères pour un char ou une corde spéciale, pourquoi devrais-je venir sur toute la chaîne, il peut y avoir 1000 caractères ou des multiples de cela. ce que je sais dans C++ run bibliothèque temps, toutes les fonctions ne supportent pas quelque chose comme ça par exemple strchr il va rechercher toute la chaîne, je ne veux pas que je veux comparer une partie spécifique de la chaîne de [] à []. J'ai vu une solution pour ce problème en utilisant wmemchr mais j'ai besoin qu'il dépende de la locale actuellement sélectionnée, si quelqu'un sait comment faire cela, je serais reconnaissant.comment rechercher une partie d'une chaîne pas tout

Aussi comment comparer seulement 2 caractères directement en rapport avec les paramètres régionaux?

Répondre

0

que

int64 Compare(CHAR c1, CHAR c2, bool ignoreCase = false) 
{ 
    return ignoreCase ? _strnicoll(&c1, &c2, 1) : _strncoll(&c1, &c2, 1); 
} 

int64 IndexOf(const CHAR* buffer, CHAR c, uint count, bool ignoreCase = false) 
{ 
    for (uint i =0; i < count; i++) 
    { 
     if (Compare(*(buffer + i), c, ignoreCase) == 0) 
     { 
      return i; 
     } 
    } 
    return npos; 
} 

int64 LastIndexOf(const CHAR* buffer, CHAR c, uint count, bool ignoreCase = false) 
{ 
    while(--count >= 0) 
    { 
     if (Compare(*(buffer + count), c, ignoreCase) == 0) 
     { 
      return count; 
     } 
    } 
    return npos; 
} 

npos = -1

et pour spécifier l'index de début de passe (tampon + startIndex) en tant que tampon pour la deuxième ou la troisième méthode

0

Je ne suis pas au courant d'un moyen de le faire directement avec une librairie standard, mais vous pouvez facilement créer votre propre fonction et strstr.

/* Find str1 within str2, limiting str2 to n characters. */ 
char * strnstr(char * str1, const char * str2, size_t n) 
{ 
    char * ret; 
    char temp = str1[n]; // save our char at n 
    str2[n] = NULL; // null terminate str2 at n 
    ret = strstr(str1, str2); // call into strstr normally 
    str2[n] = temp; // restore char so str2 is unmodified 
    return ret; 
} 

Pour votre deuxième question:

également comment comparer à seulement 2 caractères concernant directement les paramètres régionaux?

Je ne suis pas sûr de ce que vous voulez dire. Demandez-vous comment comparer directement deux personnages? Si oui, vous pouvez simplement comparer comme toutes les autres valeurs. si (str1 [n] == str2 [n]) {...} faire quelque chose ...

+0

merci pour votre réponse, mais je pense que ce n'est pas une bonne pratique pour changer le contenu d'une donnée pour une simple recherche, et si un autre thread demande la chaîne ou sa longueur en même temps ?? Cela causera un problème. – ahmedsafan86

0

Vous pouvez utiliser std::substr pour limiter votre zone de recherche: Je résolus comme

std::string str = load_some_data(); 
size_t pos = str.substr(5).find('a'); 
+0

Merci pour la réponse, La performance est un problème pour moi à ce morceau de code, la sous-chaîne renvoie une nouvelle copie d'une partie de la chaîne, je n'ai pas besoin de copier afin de rechercher. – ahmedsafan86

Questions connexes