2010-04-07 5 views
4

Je ne trouve pas d'expression pour évaluer une partie d'une chaîne.C: évaluer une partie de la chaîne

Je veux obtenir quelque chose comme ça:

if (string[4:8]=='abc') {...} 

j'ai commencé à écrire comme ceci:

if (string[4]=='a' && string[5]=='b' && string[6]=='c') {...} 

mais si je dois évaluer une grande partie de chaîne comme

if (string[10:40] == another_string) {...} 

alors il arrive à écrire trop d'expressions. Y a-t-il des solutions prêtes à l'emploi?

Répondre

6

Vous pouvez toujours utiliser strncmp(), donc string[4:8] == "abc" (qui ne soit pas la syntaxe C, bien sûr) pourrait devenir strncmp(string + 4, "abc", 5) == 0.

+1

ouais, et d'être tout à fait correct, le troisième argument de la fonction (5) devrait en fait être 3 - égal à la longueur de la chaîne évaluée. – Halst

+1

Vous pouvez utiliser ici 'sizeof" abc "- 1', ce qui pourrait le rendre un peu moins sujet aux erreurs que de compter les caractères à la main pour des chaînes très longues. – caf

+0

@Halst: Cela dépend de la comparaison. Une tranche [4: 8] n'a pas trois caractères, quelle que soit la notation. –

2

La fonction de bibliothèque C standard que vous souhaitez est strncmp. strcmp compare deux chaînes de caractères C et, comme le modèle habituel, la version «n» traite des éléments de données de longueur limitée.

if(0==strncmp(string1+4, "abc", 4)) 
    /* this bit will execute if string1 
     ends with "abc" (incluing the implied null) 
     after the first four chars */ 
0

Les solutions strncmp que d'autres ont postées sont probablement les meilleures. Si vous ne souhaitez pas utiliser strncmp, ou si vous voulez simplement savoir comment implémenter votre propre, vous pouvez écrire quelque chose comme ceci:

int ok = 1; 
for (int i = start; i <= stop; ++i) 
    if (string[i] != searchedStr[i - start]) 
    { 
     ok = 0; 
     break; 
    } 

if (ok) { } // found it 
else  { } // didn't find it 
Questions connexes