2013-09-26 13 views
5

Nella lettura: How can I check that elements of an array are all same without using counter?, @Skizz utilizza la soluzione elegante:valore di ritorno di memcmp (ptr1, ptr2, 0)?

memcmp (&string [0], &string [1], sizeof string [0] * (N - 1)) 

Quindi, se N sembra essere 1, otteniamo

memcmp (&string [0], &string [1], 0) 

è il valore di ritorno certo di essere 0 quando il confronto la lunghezza è 0?


caso di prova (Cygwin gcc version 4.8.1 Windows a 64 bit) restituisce 0. Quindi so su questo e pochi altri compilatori/piattaforme che si tratta di 0.

printf("%d\n", memcmp("foo", "bar", 0)); 

C11 progetto spec segue, ma appare tranquillo sulla questione. Forse un'altra parte delle specifiche o qualcosa dice qualcosa?

7.24.4.1 La funzione memcmp
Trama

#include <string.h> 
int memcmp(const void *s1, const void *s2, size_t n); 

Descrizione
La funzione memcmp confronta i primi n caratteri dell'oggetto puntato da s1 a i primi n caratteri dell'oggetto puntato da s2.

ritorni
La funzione memcmp restituisce un intero maggiore, uguale o minore di zero, pertanto come l'oggetto puntato da s1 è superiore, uguale o inferiore dell'oggetto puntata da s2 .


(Si supponga & string [1] non ha riferimento alla memoria illegale)

+0

Se 1 == N allora non farlo. –

+0

'memcmp' non è affidabile per confrontare due oggetti con lo stesso valore se gli oggetti possono contenere byte di riempimento, bit di riempimento o più codifiche dello stesso valore (come uno zero positivo e uno zero negativo). –

+0

@koodawg: Perché no? –

risposta

10

La parte rilevante della specifica è proprio questo uno

7,21 movimentazione String

7.21.1 Convenzioni sulle funzioni di stringa

Dove un argomento dichiarati size_t n specifica la lunghezza del matrice per una funzione, n può avere il valore zero in una chiamata a tale funzione . Se non diversamente specificato esplicitamente nella descrizione di una particolare funzione di in questa sottoclaus, gli argomenti del puntatore su tale chiamata devono ancora avere valori validi, come descritto in 7.1.4. Su tale chiamata , una funzione che individua un carattere non trova alcuna occorrenza, una funzione che confronta due sequenze di caratteri restituisce zero e una funzione che copia caratteri copia zero caratteri.

Ciò significa che memcmp restituisce zero quando la lunghezza della sequenza fornita è zero.

+0

Mi sembra buono. Lo stesso nella bozza _C11 7.24.1 2_. Suppongo che il tuo riferimento sia da C99? – chux

+0

@chux: Sì, C99. – AnT

+1

Siamo sicuri che memcmp rientra nella gestione delle stringhe 7.21? Ovviamente non è tecnicamente una funzione di stringa. –