C - vérifier si la chaîne est une chaîne à une autre chaîne
J'ai besoin d'écrire un programme qui prend deux chaînes de caractères comme arguments et de vérifier si la seconde est une sous-chaîne de la première. J'ai besoin de le faire, sans utiliser de spécial les fonctions de la bibliothèque. J'ai créé cette application, mais je pense que c'est toujours de retourner true tant qu'il y a une lettre qui est la même dans les deux chaînes. Pouvez-vous m'aider ici. Je ne suis pas sûr de ce que je fais de mal:
#include <stdio.h>
#include <string.h>
int my_strstr( char const *s, char const *sub ) {
char const *ret = sub;
int r = 0;
while ( ret = strchr( ret, *sub ) ) {
if ( strcmp( ++ret, sub+1 ) == 0 ){
r = 1;
}
else{
r = 0;
}
}
return r;
}
int main(int argc, char **argv){
if (argc != 3) {
printf ("Usage: check <string one> <string two>\n");
}
int result = my_strstr(argv[1], argv[2]);
if(result == 1){
printf("%s is a substring of %s\n", argv[2], argv[1]);
} else{
printf("%s is not a substring of %s\n", argv[2], argv[1]);
}
return 0;
}
si vous devez le faire sans l'aide de toute spéciale les fonctions de la bibliothèque", alors vous ne devriez pas utiliser strchr et strcmp. en fait strcmp est où votre problème est de toute façon.
Ce sont juste des ordinaire des fonctions de la bibliothèque. Il n'y a rien de spécial en eux 🙂
si
Leffler: Bien Sûr. J'ai été rappelé, en effet, que, en fait, il n'y a pas de "spécial" de la bibliothèque de fonctions - seulement les fonctions de la bibliothèque, de la période.
Ce sont juste des ordinaire des fonctions de la bibliothèque. Il n'y a rien de spécial en eux 🙂
si
strchr()
et strcmp()
sont ordinaires, donc, est strstr()
...Leffler: Bien Sûr. J'ai été rappelé, en effet, que, en fait, il n'y a pas de "spécial" de la bibliothèque de fonctions - seulement les fonctions de la bibliothèque, de la période.
OriginalL'auteur user69514 | 2010-04-12
Vous devez vous connecter pour publier un commentaire.
De votre approche de l'écriture
strstr
est fondamentalement vicié. Nous allons regarder ce que vous avez écrit:Tout d'abord, depuis l'initialisation de
ret
à point àsub
, vous comparezsub
contre lui-même, et de ne jamais regarders
. Mais supposons que vous vouliez dire pourret
être initialisé às
...ret = strchr( ret, *sub )
trouve la position du caractère suivant desub
dansret
, et puis des avancesret
de sorte qu'il démarre sur ce personnage.Ensuite, vous exécutez
strcmp( ++ret, sub+1 )
qui détermine si la chaîne de caractères commençant par le caractère suivant deret
est égal à la chaîne en commençant par le caractère suivant desub
, et puis des avancesret
à commencer par le caractère suivant (peu importe de savoir si le test est vrai ou faux).Clairement, cette logique n'est pas de faire ce que vous voulez. Ce qu'il va réellement faire est de déterminer si la sous-chaîne est égale à la chaîne
s
ou se trouve à l' fin de la chaînes
et comprend aucune répétition de lettres.Voici un schéma général de l'algorithme que vous souhaitez:
sub
danss
. Si pas trouvé, retourne false.s
de sorte qu'il commence à cette positionsub
estn
, test si le premiern
caractères des
matchsub
(en faisant attention de ne pas exécuter après la fin des
). Si oui, retourne true. Sinon, l'avances
par un personnage et la boucle.Noter que vous ne devriez jamais être à la recherche d'un caractère dans
sub
autres que la première. L'idée est d'utiliser le premier caractère desub
pour trouver potentiel positions de départ poursub
danss
, et de vérifier ensuite si la sous-chaînesub
existe réellement. Si elle n'est pas là, vous voulez jeter l'intégralité des
jusqu'à ce point, et puis recommencer en essayant de trouver la prochaine potentiels position de départ.OriginalL'auteur Tyler McHenry
Bien, vous ne devriez pas être la modification de
ret
dansmy_strstr
. Etstrcmp
ne permet pas de comparer des sous-chaînes, il compare les chaînes de caractères. Vous voudrez probablement utiliserstrncmp
.OriginalL'auteur MSN
Il semble que vous êtes à la recherche pour char *sous char * sub:
ne devriez-vous pas être paramètre ret pour s?
Aussi strcmp compare les chaînes, pas de sous-chaînes si strcmp("abcde", "abc") renvoie la valeur false. Vous voulez probablement strncmp qui prend également un entier spécifiant la longueur.
OriginalL'auteur Niki Yoshiuchi
Quand
est rencontré pour la première fois,
ret == sub
. Donc,strchr(ret, *sub)
est à la recherche la première occurrence de la première char deret
dansret
. Qui sera de retourret
.Donc,
ret
reste inchangé.Prochaine,
ret
est toujours égal àsub
, de sorte que la déclaration ci-dessus est vrai.Et vous obtenez
1
de retour.OriginalL'auteur N 1.1
Il peut aider à briser cette tâche un peu différemment. Il y a deux parties principales: 1) trouver le point de départ de potentiel sous-chaîne de matchs et 2) de tester si ce point de départ est en effet une correspondance de sous-chaîne. Par conséquent, de mettre en œuvre ce que les deux fonctions.
Tout d'abord , créez une fonction qui détermine si deux chaînes sont identiques. Cela devrait être relativement facile à code, il suffit de comparer première lettre avec la première lettre, la deuxième la deuxième, etc. Si vous trouvez deux qui ne correspondent pas, retourne false. Si vous le faites à la fin de l'une des chaînes, retourner la valeur true. Si vous êtes autorisé à utiliser
strncmp
, alors ce serait tout simplement(strncmp(a, b, strlen(b)) == 0)
(en supposant queb
est toujours la plus courte chaîne).Deuxième, de créer une fonction qui parcourt une chaîne de caractères, la recherche d'une certaine lettre. Chaque fois qu'il estime que la lettre, il appelle une fonction et passe un pointeur vers cette lettre dans la chaîne. En d'autres termes, si vous l'avez appelé
my_function("This is a sample string", 's')
, alors la fonction est de marcher à travers la chaîne, trouver toutes les quatre occurrences de la lettre " s " et d'appeler une fonction à l'aide d'un pointeur vers cette lettre dans la chaîne. Dans ce cas, la fonction que vous appelez est la fonction décrite dans le paragraphe précédent.À l'aide de cette rupture, vous allez retourner "true" dès que l'un des appels à la sous-fonction renvoie "true", ou vous retourne "false" si vous le faites à la fin de la chaîne d'entrée.
OriginalL'auteur bta
ret est de stocker l'adresse de sous-tableau et dans
tandis que la déclaration
strchr(ret,*sub)
la comparaison de la valeur dans
sub
avec adresse stockée dansret
si cela va fonctionner ou pas (cette comparaison est juste ou pas)
répondre à quelqu'un s'il vous plaît...
OriginalL'auteur Naveen Kumar