web-dev-qa-db-fra.com

C comparant des pointeurs (avec des caractères)

Bonsoir, j'ai 2 fonctions et chacune accepte comme argument un pointeur sur char:

char pointer[255];
func1(char* pointer)
{
...
memcpy(pointer,some_char,strlen(something));
return;
}
func2(char* pointer)
{
...
if (pointer==someother_char) exit(0); //FAILs
//also I have
if(pointer==someother_pointer2char); // FAILs
}

Maintenant, j'ai essayé strstr, strcmp etc ... ne fonctionne pas. Je voulais essayer memcmp mais je n'ai pas de len statique. Comme je dois comparer caractère * à caractère et caractère * à caractère * il me faudrait deux solutions, non?

Alors, comment comparer ces pointeurs (en réalité les pointes) de la manière la plus courte possible?

Merci.

MODIFIER

Merci à wallacer et Code Monkey maintenant pour char * to char comparaison que j'utilise ci-dessous:

func1(char* ptr){
char someother_char[255];
char *ptr_char = NULL; //I have to strcmp a few values so this is why I initialize it first
... 
ptr_char = someother_char;
if (strcmp(ptr,ptr_char) == 0) //gtfo and it does...
...
ptr_char = some2nd;
if(strcmp...

Des suggestions peut-être ... (hmm fonction externe pour comparer?)

Suggestion1 (par Code Monkey)

#include <stdio.h>

int main(void) {
    char tempchar[255];
    tempchar[0] = 'a';
    tempchar[1] = 'b';
    tempchar[2] = '\0';
    char *ptr_char;
    ptr_char = &tempchar[0];
    printf("%s", ptr_char);
    return 0;
}
12
cat9

Vous devez utiliser strcmp. Ne voyant pas comment vous avez essayé de l'utiliser, voici comment vous devriez l'utiliser:

char *someother_char = "a";
char *pointer = "a";

if (strcmp(pointer, someother_char) == 0) { // match!
}
else { // not matched 
}

pour faire ensuite la comparaison avec un char, vous devez passer à un char*:

char *someother_char1;
char test = 'a';
char *pointer = "a";

strncpy((char*)test,someother_char1,sizeof(test));

if (strcmp(pointer, someother_char1) == 0) { // match!
}
else { // not matched 
}

si vous voulez utiliser le char array , vous devez déréférencer:

char char_array[255];
// don't forget to fill your array
// and add a null-terminating char somewhere, such as char_array[255] = '\0';
char *ptr_somechar = &char_array[0];
char *pointer = "a";

if (strcmp(pointer, ptr_somechar) == 0) { // match!
} else { // not matched
}
20
user195488

Dès le départ, si vous souhaitez comparer les pointes, vous devez les déréférencer. Cela signifie que pour comparer la valeur de caractère réelle, vous devrez appeler 

if (*pointer == someother_char)

Cependant, cela ne fera que comparer le premier caractère du tableau, ce qui n'est probablement pas ce que vous voulez faire.

Pour comparer le tout, strcmp devrait fonctionner 

char* someother_str = "hello strstr";
if(strcmp(pointer, someother_str) == 0) {
    // do something
}

Assurez-vous que votre autre chaîne est déclarée comme un caractère * 

Plus d'infos: http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

Edit: selon votre commentaire. comparer char * et char n'a pas vraiment de sens. L'un est une valeur de caractère, l'autre est une adresse en mémoire. Pour ce faire, vous pouvez déréférencer le caractère * ou référencer la variable de valeur.

char c;
char* ptr;

// dereference ptr
if ( c == *ptr ) {
   ...
}

// reference the value
if ( &c == ptr ) {

}

La première méthode vérifie si les valeurs sont les mêmes. La seconde vérifie si ptr pointe en fait sur la mémoire contenant c ie. est-ce que ptr est un pointeur sur c

J'espère que cela pourra aider

1
wallacer

Utilisez la fonction srtncmp no srtcmp.

int res = strncmp(str, "¿Cuál es tu nombre? ", 100);

Voir le lien suivant 

comparer les chaînes

0
Ronald