2009-05-09 4 views
2

Pour 2 chaînes, écrivez une fonction qui renvoie la position de la chaîne B qui correspond à la chaîne A si la chaîne A est une sous-chaîne de la chaîne B. Sinon, renvoyez -1. Exemple:Exercice d'extraction de sous-chaîne

strA = "ello" 
strB = "Hello_World" 
Your function should return 1. 

strA = "blah" 
strB = "blha" 
Your function should return -1. 
+1

Comme je vois que les questions posées par le génie sont acceptées ici! Pourquoi tout le monde est si impoli avec les débutants? – backslash17

+1

Ne faites pas faire vos devoirs par d'autres personnes. Vous n'apprendrez pas ce que vous êtes censé apprendre si vous ne le faites pas vous-même. – lothar

+1

Parce que ce n'est pas HomeworkOverflow. Vous n'avez pas à être un génie, mais vous devez ne pas essayer de tricher sur les devoirs, et mettre un peu d'effort pour résoudre le problème vous-même – Yuliy

Répondre

2

version Brute force:

int strpos(char* a, char* b) { 
    int n1, n2, i, j; 
    n1 = strlen(a); 
    n2 = strlen(b); 
    for (i = 0; i < n1-n2; i++) { 
    for (j = 0; j < n2; j++) { 
     if (a[i+j] != b[j]) break; 
     else if (j+1 == n2) return i; 
    } 
    } 
    return -1; 
} 

algorithmes plus efficaces: Wikipedia: String searching

+2

Si vous allez utiliser string.h de toute façon (ou même si vous ne l'êtes pas), pourquoi si verbeux? En outre, en effectuant strlen à l'avance, vous perdez la plupart de votre avantage de sortir de la boucle. –

+0

Juste pour montrer comment cela peut être fait. –

+0

Oui, mais comme je l'ai dit, c'est une mise en œuvre naïve, à cause du strlen, entre autres choses. –

3

Est-ce devoir? Quoi qu'il en soit, regardez le string.h documentation et vous devriez trouver ce dont vous avez besoin sans trop de problèmes. Vous devrez écrire un wrapper très fin sur l'une des fonctions. Ou, bien sûr, vous pouvez tout écrire vous-même.

EDIT: Eh bien, quelqu'un d'autre a donné une réponse, alors voici ma tentative.

#include <string.h> 

ssize_t str_index(const char *strA, const char *strB) 
{ 
    const char *result; 
    return (result = strstr(strB, strA)) ? (result - strB) : -1; 
} 

Les seuls trucs sont que l'ordre des paramètres est inversé par rapport à strstr, vous retournez un ssize_t au lieu de char *, et le code d'échec est donc -1.

+0

Je voulais juste dire que vous faites confiance à strstr() pour avoir une implémentation "sympa", alors que ça pourrait être un désastre morbide. – Tom

+0

Et que size_t est non signé. ssize_t devrait être utilisé. – Tom

+0

Bonne prise sur ssize_t. Par curiosité, quelqu'un sait-il quel (le cas échéant) le niveau d'avertissement attrape cela avec gcc? -Wall -Wextra n'a pas. Et oui, je fais délibérément confiance à strstr parce que je n'ai aucune raison de ne pas le faire. –

0

Cela semble presque exactement comme un problème de travail. Dans le cas étrange que ce n'est pas un problème de devoirs, la fonction de bibliothèque C strstr renvoie un pointeur sur la première occurrence d'une chaîne dans une autre (ou null si elle n'est pas là). De là, il est trivial de déterminer l'index en utilisant l'arithmétique du pointeur.

2
#include <string.h> 

int search(char* a, char* b) { 
    char* pos; 
    pos = strstr(b, a); 
    if(pos == 0) return -1; 
    return (int)(pos-b); 
} 
0

Essayer de connaître strstr. Son disponible dans string.h JAMAIS une raison pour coder quelque chose déjà disponible dans la bibliothèque standard. Sauf bien sûr, c'est une question de devoirs :)

+0

Son toujours pas à la maison. Parfois, les gens essaient de mettre en œuvre la fonction afin qu'ils puissent obtenir le fonctionnement de la fonction d'une meilleure manière –

+0

@fahad: assez juste mais la façon dont OP posait sa question sentait comme des devoirs –

Questions connexes