Pb strcmp

Résolu/Fermé
Utilisateur anonyme - 1 févr. 2009 à 18:30
 Utilisateur anonyme - 1 févr. 2009 à 20:20
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 mercredi 20 février 2008 Statut Membre Dernière intervention 14 mai 2011 60
1 févr. 2009 à 18:48
#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
1 févr. 2009 à 18:54
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 mercredi 20 février 2008 Statut Membre Dernière intervention 14 mai 2011 60
1 févr. 2009 à 18:58
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
1 févr. 2009 à 18:59
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 févr. 2009 à 19:08
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
1 févr. 2009 à 19:11
non ca ne marche pas ... quelqu'un aurait une idée comment faire?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 févr. 2009 à 19:19
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
1 févr. 2009 à 19:22
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 févr. 2009 à 19:32
Bah oui, c'est exactement ce que je te disais dans mon post ;)
0
Utilisateur anonyme
1 févr. 2009 à 19:24
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 mercredi 20 février 2008 Statut Membre Dernière intervention 14 mai 2011 60
1 févr. 2009 à 19:32
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 févr. 2009 à 19:36
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 févr. 2009 à 19:38
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
1 févr. 2009 à 19:45
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 févr. 2009 à 19:56
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
1 févr. 2009 à 20:20
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