la mise en œuvre de strstr() la fonction
Le code dit à de nombreux endroits non valide "indirection".S'il vous plaît aider.
int main()
{
char *s1,*s2,*position;
printf("Enter string:\n");
gets(s1);
printf("Enter word to find:\n");
gets(s2);
*position=ststr(*s1,*s1);
if(*position)
printf("word is found at %c loc\n",*position);
else
printf("word not found");
getch();
return 0;
}
char *strstr(char *s1,char *s2)
{
int flag=1;
char i,j;
for(i=0; ;i++)
{
if(*s1[i]==*s2[0])
for(j=i;*s2;j++)
{
if(*s1[j]!=*s2[j])
flag=0;
}
}
if(flag)
return i;
else
return 0;
}
- oh mon dieu, c'est plein d'étoiles!
- Vous avez une autre façon que 😛 ?
Vous devez vous connecter pour publier un commentaire.
D'abord,
s1
ets2
en principal n'ont pas été initialisées à pointer n'importe où significative. Soit de les déclarer comme des tableaux statiques, ou d'allouer de la mémoire à eux au moment de l'exécution à l'aide demalloc()
oucalloc()
:Deuxième, JAMAIS jamais JAMAIS jamais JAMAIS utilisation
gets()
; il sera introduire un point de défaillance dans votre programme. Utilisationfgets()
à la place:MODIFIER
Et comme tout le monde l'a souligné, la comparaison dans le
strstr()
fonction doit êtreou
mais d'abord vous devez traiter avec l'affectation des tampons principaux correctement.
est un exemple où mon gcc se plaint:
si
s1
est un pointeur verschar
,s1[i]
est un char. Donc vous ne pouvez pasdereference
plus (avec le*
), c'est à dires1[i]
ne pointe pas vers plus de rien.Essayer
à la place.
Vous devez également modifier la valeur de retour de
strstr
: vous renvoyer un nombre entier où vous déclarer à retourner un pointeur sur un caractère. Donc, essayez de retourners1+i
à la place.Ici:
n'est probablement pas ce que vous voulez. Vous n'êtes pas avancer le pointeur
s2
n'importe où dans la boucle, en fait, vous êtes juste à tester si l's2[0]
(qui est le même que*s2
) est égal à zéro pour chaque itération. Sis2
n'est pas la chaîne vide, cette boucle ne sera jamais la fin.*s1
signifie "le personnage, où s1 est de pointage".s1[j]
signifie "*(s1+j)
" ou "le caractère j positions après où s1 est de pointage"Vous devez utiliser l'une ou l'autre, pas les deux.
L'un des problèmes que je m'aperçois à chaque fois que vous ne
*s1[j]
. L'astérisque est un déréférencement de la matrice, et c'est la[]
notation.s[i]
signifie vraiment*(s + i)
, de sorte que vous n'avez pas à déréférencement d'elle de nouveau. La façon dont vous avez il serait lire**(s + i)
, et puisque c'est un seul pointeur, vous ne pouvez pas le faire.flag
variable et lacontinue
etbreak
trucs dans la boucle interne sont inutiles. Le corps de la boucle interne pourrait être juste{ if (s1[j-i] == '\0') return(s2 + i); if (s2[j] != s1[j-i]) break; }
, ou à peu près.