2015-07-31 3 views
0

J'ai trois questions,Que va-t-il se passer -1 comme valeur pour le 3ème paramètre dans strncmp() ie. n nombre d'octets d'octets à comparer?

  1. Que se passera-on passe -1 en tant que valeur pour le 3ème paramètre dans strncmp() par exemple. n nombre d'octets d'octets à comparer?
  2. Pourquoi la sortie diffère-t-elle en ARM et PPC? c'est à dire. si celui qui est correct?
  3. Si j'utilise memcmp au lieu de strncmp, je reçois une sortie "inside else" dans ARM et PPC. Comment et pourquoi?

    char str[10]; 
    
    memset(str,'\0',sizeof(str)); 
    
    printf("str:%s ,len:%d\n\r",str,strlen(str)); 
    
    if(strncmp(str,"Maximum",(strlen(str)-1)) == 0)  
    {   
        printf("inside if\n\r");  
    } 
    else  
    {  
        printf("inside else\n\r");  
    } 
    

Sortie dans ppc

str: ,len:0 
inside else 

Sortie dans le bras

str: ,len:0 
inside if 
+3

Le troisième argument de 'strncmp()' est de type 'size_t', qui est non signé. – EOF

+0

Puisque l'une des chaînes est vide, vous comparez 0 caractères de l'un contre 0 caractères de l'autre sans tenir compte de la limite (mais sans la garantie d'égalité que vous auriez si le _limit_ était de 0). – Notlikethat

+0

Qu'est-ce que vous ne comprenez pas ce qui n'est pas décrit dans la documentation des deux fonctions? http://man7.org/linux/man-pages/man3/strcmp.3.html http://man7.org/linux/man-pages/man3/memcmp.3.html – alk

Répondre

0

Que se passera-on passe -1 en tant que valeur pour le 3ème paramètre dans strncmp()

En supposant que le troisième paramètre est défini un être de size_t et en outre en supposant que size_t est défini comme unsigned entier, en passant -1 se traduira par un « wrap-around » et la fonction de réception de la valeur de SIZE_MAX. Sur un système 32 bits, ce serait probablement 0xffffffff.