7
votes

STRCMP avec des pointeurs ne fonctionnant pas dans c

Pourquoi ce code ne fonctionne pas. Il suffit d'essayer de vérifier si l'entrée de l'utilisateur est identique à un mot de passe xxx


1 commentaires

Pourquoi -1? J'apprends; essayé de trouver la réponse ici; Et pour les débutants, il n'est pas facile de comprendre d'autres réponses.


6 Réponses :


4
votes

passe est un pointeur non initialisé et vous essayez d'y écrire. Vous devez allouer suffisamment de mémoire pour tenir une chaîne. Par exemple, Char Pass [Taille] fonctionnera mieux.


1 commentaires

En effet. Remarque Vous pouvez également utiliser une allocation dynamique (avec un pointeur sur char ), mais il est inutile ici.



1
votes

Vous devez affecter le Pass de sorte que le scanaf aura une place pour stocker l'entrée. Sinon, vous avez une corruption de mémoire.


0 commentaires

10
votes

Vous n'avez pas réellement attribué d'espace pour mettre des données. Définition d'un pointeur définit simplement une variable qui peut contenir l'adresse d'un bloc de données, elle n'alloue pas le bloc.

Vous avez quelques options, allouez une mémoire dynamique sur le tas pour écrire et faire le point de pointeur. à cela. Ou utilisez la mémoire allouée statique sur la pile et passez l'adresse à vos appels. Il y a peu d'avantages à la mémoire dynamique dans ce cas (car il est temporaire d'utilisation et de petite taille). Vous auriez plus de travail à faire si vous avez utilisé une mémoire dynamique - vous devez vous assurer de recevoir ce que vous avez demandé lors de l'attribution et de l'avoir remis lorsque vous avez terminé et que vous vous assurez de ne pas l'utiliser. Après que vous ayez remis (difficile dans une grande application, croyez-moi!) C'est juste plus de travail, et vous ne semblez pas avoir besoin d'effort supplémentaire.

Les exemples ci-dessous auraient également besoin d'une erreur importante. Vérification, mais vous donner l'idée générale.

par exemple par exemple xxx

ou xxx


3 commentaires

très clair. Vous avez oublié le & dans la 2e options Scanf. Je n'ai pas compris pourquoi est préférable d'utiliser la mémoire dynamique (tas) que la mémoire statique (pile). Qui est plus petit?


Vous n'avez pas besoin de l'ampersand pour l'appel Scanf car vous référez-vous à un tableau sans index est l'adresse, c'est-à-dire pass == & pass [0]


@Joe e.d.g.e., pas i.e. / grammaire-nazi



0
votes

Oui, le pointeur n'a pas été initialisé. Si vous le débogez, vous obtiendrez une défaut de violation d'accès ou de segmentation code>. Le code peut être modifié comme suit.

 char pass[22];//22 can be replaced with other number

    printf("Write the password: ");
    scanf("%s", pass); 
    if( strcmp( pass , "acopio") == 0)
    printf("fu");//just to check


1 commentaires

@DAVESHAW: Je voulais poster la même chose, mais Stackoverflow ne me permettrait pas de sauvegarder les modifications <6 caractères du changement: D



0
votes

Vous n'avez pas initialisé PASS code> pour pointer sur un tampon ou un autre emplacement pour stocker l'entrée.

Pour quelque chose de simple comme ceci, vous pouvez déclarer passer code> comme une matrice de char code> au lieu d'un pointeur: p>

char pass[N]; // where N is large enough to hold the password plus a 0 terminator

scanf("%s", pass);
if (strcmp(pass, "acopio") == 0)
{
  ...
}


0 commentaires

0
votes
#include<stdio.h>
main()
{
    int mystrcmp(char *,char *);

    char s1[100],s2[100];
    char *p1,*p2;
    p1=s1;
    p2=s2;
    printf("Enter the first string..?\n");
    scanf("%s",p1);
    printf("Enter the second string..?\n");
    scanf("%s",p2);
    int x=mystrcmp(p1,p2);
    if(x==0)
        printf("Strings are same\n");
    else
        printf("Strings are not same..\n");


}
int mystrcmp(char *p1,char *p2)
{
    while(*p1==*p2)
    {
        if(*p1=='\0' || *p2=='\0')
            break;
        p1++;
        p2++;
    }
    if(*p1=='\0' &&as *p2=='\0')
        return(0);
    else
        return(1);
}
simple code for beginners....

0 commentaires