2017-05-24 1 views
0

J'ai un problème lorsque j'essaie de comparer le contenu de deux tableaux de char. Parfois Si la chaîne est inférieure à la taille réelle du tableau, il n'y a pas de séquence de '\ 0' mais il y a souvent des caractères inattendus (dans le débogage xcode il y avait le caractère '\ x01' et dans le contrôle boucle que j'utilise Pour vérifier si une cellule mémoire du tableau était la même que l'autre, ce n'était pas pareil). Donc, pour surmonter ce problème, j'ai décidé de forcer l'utilisateur à écrire le contenu du tableau exactement comme la taille du tableau (-1): ex. array [3], les utilisateurs écrivent "hi" (sans le ""). Donc je me demandais s'il y avait un moyen de comparer les deux chaînes (je ne parle pas de longueur mais de contenu) sans remplir complètement le tableau afin de comparer le contenu du code du centre ici les deux tableaux à travers un cycle simple. (Je pensais à initialiser le vecteur \ 0 mais je ne sais pas s'il peut y avoir des problèmes) merci pour les réponsesComparer le contenu de deux tableaux char dans C

ceci est un exemple du code

}while(sent !=1); 


for(contatore=0; contatore<MAXNOME; contatore++){ 

    if(UserName[contatore] == persona.username[contatore]){ 

     controlloUsr++; 
    } 

} 


for(contatore=0; contatore<MAXNOME; contatore++){ 

    if(password[contatore] == persona.password[contatore]){ 

        controlloPsw++; 
    } 

} 


if(controlloUsr == MAXNOME && controlloPsw == MAXPSW){ 

    return 1; 

} else { 

    return 0; 
} 
+1

S'il vous plaît montrer un [MCVE]. Il n'y a pas assez d'informations dans la question. –

+0

Nous avons besoin de savoir comment les variables d'utilisation sont définies et initialisées. – alk

Répondre

0

Je ne suis pas sûr si c'est ce que vous demandez, mais il n'y a aucun moyen de parcourir un tableau de caractères en C sans donner au code une séquence d'arrêt, comme un \ 0, ou vous le parcourrez pour toujours (enfin, jusqu'à ce qu'un segfault sauvage apparaisse

Vous pouvez écrire votre propre fonction strncmp pour cela, quelque chose comme:

int my_strncmp(char *str1, char *str2, size_t max, char c) 
{ 
    size_t n = 0; 
    while (n < max) 
    { 
     if ((str1[n] != str2[n]) || (str1[n] == c) || (str2[n] == c)) 
      return 0; 
     n++; 
    } 
    return 1; 
} 

Cela retournera 0 si votre char c est rencontré, ou si les chaînes sont différentes, ou 1 si la chaîne est la même jusqu'à max char. Assurez-vous simplement que l'une des deux conditions est remplie ou que votre code va tomber en panne dans un segfault/avoir un comportement indéfini, puisque vous allez naviguer hors de votre plage de mémoire autorisée.

+0

Une chaîne C doit par définition être terminée par un caractère '\ 0', qui fait lui-même partie de la chaîne. 'max' devrait être de type' size_t', qui est le type correct pour les indices de tableau, et 'my_strnlen()' devrait retourner le type 'size_t'; c'est aussi le type retourné par la famille de fonctions de la bibliothèque 'strlen()'. Code peut ou non segfault après l'accès hors-limites; le comportement est indéfini. –

+0

Pourquoi cette fonction s'appelle 'my_strnlen()'? Il ne retourne pas une longueur, mais est une fonction de comparaison. –

+0

Merci! Réponse mise à jour avec vos commentaires –

0

la fonction strcmp() et le strncmp() sont faits pour cette opération exacte.

Vous pouvez lire la page man pour ces deux fonctions pour tous les détails.