1
votes

J'aimerais savoir quel est le problème qui cause un mauvais affichage dans mon code?

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");
}


2 commentaires

La deuxième condition de boucle while utilise un index incorrect. Doit être j au lieu de i


Pourquoi la fonction gets dangereux de ne pas l'utiliser?


3 Réponses :


0
votes

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 [])


0 commentaires

0
votes

Votre code présente quatre problèmes.

  1. Vous utilisez 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;

  1. Type de paramètre incorrect de 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 string est de type char * .


  1. La deuxième boucle while utilise le mauvais objet pour prouver la condition, i au lieu de j :
printf("true");
return 1;

  1. Utilisation de 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


7 commentaires

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



0
votes

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");
}


1 commentaires

Mais ce n'est pas la seule et unique erreur que vous avez commise. Regardez ma réponse .