Pb strcmp

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
slt à tous ,
j'ai un pb a manipuler strcmp en fait j'ai deux chaine login et user_login comme ceci:

char * login = "foufou"
char * user_login[20] = "foufou "

et losque je les compare avec strcmp il retourne tjs que ce n'est pas equivalent

quelqu'un peut il m'aider?

15 réponses

loveparade Messages postés 506 Date d'inscription   Statut Membre Dernière intervention   60
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char * login = "foufou";
	char  user_login[20] = "foufou";
	if (strcmp(login, user_login) == NULL)
		printf("ok\n");
	else
		printf("Non\n");

	system("pause");
	return EXIT_SUCCESS;
}

Tu peux pas déclarer le deuxième char en pointeur sans quoi tu comparera une valeur a une adresse.
0
Utilisateur anonyme
 
poutant j'ai essayé strncmp(login,user_login,5) et ca a marché il parait que les espace sont la source du pb
t'a une idée comment comparé les deux chaine en ignorant les espace?
0
loveparade Messages postés 506 Date d'inscription   Statut Membre Dernière intervention   60
 
En les supprimant car un espace = un caractère.
Donc faut supprimer le caractère au préalable. Soit par analyse en int (table ascii a voir) soit en char directement.

https://nicolasj.developpez.com/articles/libc/string/
0
Utilisateur anonyme
 
ah! je crois que je l'ai trouvé,

strncmp(login,user_login,strlen(user_login)); et le tour est joué

je vais essayer..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Le problème que tu as surtout dans ton exemple est que tu compares un pointeur sur un tableau de char, avec un tableau de pointeurs. Ce qui est différent.
Soit char * login = "foufou";
Soit char login[20]="foufou",
Mais pas : char *login[20]="foufou";

Cdlt
0
Utilisateur anonyme
 
non ca ne marche pas ... quelqu'un aurait une idée comment faire?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Mais si ça marche.
#include <stdio.h>
#include <string.h>

int main(void){
    char *login="foufou";
    char user_login[20]="foufou";

    if(strcmp(login,user_login)==0)
        puts("ok");
    else
        puts("pas ok");

    return 0;
}

0
Utilisateur anonyme
 
désolé j'ai fait une faute dans les instruction en fait j'ai
char user_login[20] et pas char * user_login [20] /il n'y a pas d'étoile après char

et user_login = "foufou " // il y a des espaces a la fin
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bah oui, c'est exactement ce que je te disais dans mon post ;)
0
Utilisateur anonyme
 
j'ai ecrit user_login = "foufou__________" // avec _ un espace
mais pourquoi les espace dans la fin de user_login ne s'affiche pas ?
0
loveparade Messages postés 506 Date d'inscription   Statut Membre Dernière intervention   60
 
EDIT: (ils ont raison)

Soit tu recherche les espaces et les supprime, soir comme le dis plus bas tu les laisse.
De toute façon si c'est pour un login alors vaut mieux les laisser pour éviter de faire n'importe quoi. Du coup la chaine devra être identique.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Les espaces sont affichés. Mais vu que c'est un espace tu le vois pas. Affiche un printf juste après, tu verras que ça ne sera pas collé à cause des espaces.
Si tu veux comparer les deux premiers (donc t'arrêter au premier espace), tu fais un strchr pour remplacer le premier espace par un \0. Attention dans ce cas, ça ne marchera que sur le tableau de char ;)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

En les supprimant car un espace = un caractère.
Ben, pourquoi le supprimer?
Autant ne pas le taper.

Si un espace est tapé alors c'est normal et tout à fait logique que les chaînes comparées ne soient pas égales.
Sinon, la vérification ne sers pas à grande chose puisque au lieu d'espace on pourra considérer n'importe quel caractère.
0
Utilisateur anonyme
 
bien merci infiniment pour votre aide , en fait le pb viens de la lecture a partir d'un fichier et j'ai oublié que j'ai dejé fait une fonction deletespace pour supoprimer les espaces a la fin
donc maintenant pb resolut
voici la fonction que j'ai fait:

char *deletespace(char *s){
int len;
len = strlen(s);
while(s[len-1] == ' ' || s[len-1] == '\n'){
s[len-1] = '\0';
len--;
}
return s;
}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

en fait le pb viens de la lecture a partir d'un fichier
On ne pouvais pas le savoir ;-))

Pour ta fonction, tu n'as pas besoin de faire un return vu que tu passe en paramètre le pointeur.
0
Utilisateur anonyme
 
non, ce que je veux dire par "le pb vient a partir de la lecture d'un fichier" c'est que les espace viennent de la lecture d'un champ de 20 caract (qui peut contenir des espaces) a partir fichier, mais le pb reste le meme c_a_d les espace a la fin de chaine
et a propos de char deletespace t'a raison j'aurai du le supprimer mais c'est pas grave ce n'est pas grand chose.
a+ et remerci.
0