Je voudrais savoir quel est le problème où je veux écrire une fonction qui, étant donné une chaîne, retourne TRUE si tous les caractères sont distincts et FALSE si un caractère est répété.
#include <stdio.h> char distinct_or_not_string(char *string []); int main() { char str[20]; char result; printf("please entre your string:"); gets(str); printf("\n"); result=distinct_or_not_string(str); } char distinct_or_not_string(char *string []) { int i=0,j; while(string[i]!='\0') { j=i+1; while(string[i]!='\0') { if(string[i]==string[j]) { return printf("false"); } j++; } i++; } return printf("true"); }
3 Réponses :
changez ce
while(string[j]!='\0')
en
while(string[i]!='\0')
et
changez ceci en seconde boucle while
char distinct_or_not_string(char string [])
à
char distinct_or_not_string(char *string [])
Votre code présente quatre problèmes.
gets
pour attraper la chaîne de stdin
. N'utilisez jamais gets
. Il est obsolète pour des raisons de sécurité, car avec cela, vous pourriez facilement vous heurter à un débordement de tampon, lorsque la chaîne d'entrée est plus longue que la mémoire tampon elle-même. obtient
ne pas arrêter la numérisation. Pourquoi la fonction gets est-elle si dangereuse qu'elle ne devrait pas être utilisée?
Utilisez plutôt fgets
, ce qui limite l'entrée en fonction de la taille du tampon:
#include <stdio.h> int distinct_or_not_string(char* string); int main() { char str[20]; int result; printf("please enter your string: "); char *p = fgets(str,sizeof str,stdin); if(p == NULL) { printf("Error occurred at reading the input!"); return 1; } printf("\n"); result = distinct_or_not_string(str); return 0; } int distinct_or_not_string(char *string) { int i=0,j; while(string[i] != '\0') { j=i+1; while(string[j] != '\0') { if(string[i] == string[j]) { printf("false"); return 0; } j++; } i++; } printf("true"); return 1;
distinct_or_not_string ()
: int distinct_or_not_string(char *string);
string
est de type char **
mais vous voulez passer un pointeur vers une chaîne. Utilisez char string []
ou char * string
où string
est de type char *
.
i
au lieu de j
: printf("true"); return 1;
printf
comme valeur de retour de distinct_or_not_string ()
: printf("false"); return 0;
printf ()
sera toujours évalué à 1
(en supposant qu'aucune erreur ne s'est produite lors de l'impression) et donc result dans la fonction main
aurait toujours 1
quelle que soit la chaîne a un caractère deux fois ou plus ou non, ce qui n'est pas approprié. p >
Divisez les deux et séparez chaque énoncé:
return printf("false");
et
while(string[i]!='\0')
Remarque:
distinct_or_not_string ()
n'a pas besoin de renvoyer un char
; la valeur de retour dans ce cas n'a rien à voir avec une chaîne ou un caractère de celle-ci.
Donc le type de retour de distinct_or_not_string ()
sera, à mon avis, préférable int pour une meilleure lisibilité et pour éviter les confusions, bien que ce ne soit pas une erreur syntaxique d'utiliser à la place char
. La déclaration de la fonction serait alors comme ça:
char distinct_or_not_string(char *string []);
Le code corrigé devrait être comme ça:
fgets(str, sizeof str, stdin);
Si vous souhaitez tester ce code en ligne, voici le lien: https://onlinegdb.com/H1PCstoSL
mais dans le quatrième numéro (je veux retourner l'instruction qui dit à l'utilisateur vrai ou faux, donc je ne me soucie pas des résultats réels du retour soit 0 ni 1 @ roberts-supports-monica-cellio
@sarahamdy J'ai ajouté un peu plus, peut-être que cela vous aidera à comprendre comment cela fonctionne - si chaque caractère est distinct de l'un des autres vous utilisez printf ("true")
et renvoyez la valeur 1 et sinon , vous utilisez printf ("false")
et renvoyez la valeur 0.
@sarahamdy Vous pouvez tester le code ici: onlinegdb.com/SJ_tNKiHU
donc vous mettez return 0, return 1 à distinct entre les deux retours, je veux dire dans mon code, le retour sera 1 dans les deux (distinct ou non) car j'ai utilisé l'instruction printf dans l'instruction return qui renvoie toujours 1, donc pour être plus précis nous ne devrions pas utiliser la déclaration printf en retour
@sarahamdy Le problème est quand vous voulez savoir si chaque caractère était distinct ou pas dans la fonction main ()
pour l'utiliser plus tard. Bien sûr, vous imprimez qu'il est vrai ou faux mais si vous souhaitez utiliser le résultat de distinct_or_not_string
ailleurs, vous devez savoir si c'était le cas. result
dans main
est destiné à cela et il doit contenir la valeur appropriée si vous voulez faire autre chose dans le programme basé sur si la chaîne a des caractères distincts ou non.
@sarahamdy Mais si vous ne voulez pas faire autre chose plus tard - le programme n'a que cette tâche - vous pouvez omettre la valeur de retour et l'objet return
dans main
du tout et utilisez le type de retour void
: void distinct_or_not_string (char * string)
- le type void
signifie que cette fonction n'a pas de valeur de retour valide et ne le fait pas besoin d'en avoir un.
@sarahamdy Voici le lien vers le site Wikipedia sur le type void
et ce qu'est une fonction avec une valeur de retour void
. Je vous recommande de jeter un œil à cette page. en.wikipedia.org/wiki/Void_type
mon erreur est dans la deuxième boucle où j'ai utilisé le même index i au lieu de j donc la condition est toujours vraie donc le code suivant fonctionne avec succès
#include <stdio.h> char distinct_or_not_string(char string []); int main() { char str[20]; char result; printf("please entre your string:"); gets(str); printf("\n"); result=distinct_or_not_string(str); } char distinct_or_not_string(char string []) { int i=0,j; while(string[i]!='\0') { j=i+1; while(string[j]!='\0') { if(string[i]==string[j]) { return printf("false"); } j++; } i++; } return printf("true"); }
Mais ce n'est pas la seule et unique erreur que vous avez commise. Regardez ma réponse .
La deuxième condition de boucle while utilise un index incorrect. Doit être
j
au lieu dei
Pourquoi la fonction gets dangereux de ne pas l'utiliser?