2016-10-30 6 views
-1

Ich habe eine Funktion erstellt, die einen Zeiger auf ein Array von Zeichen erhält, die eine hexadezimale Zahl darstellen, und den Dezimalwert davon zurückgibt.Verbesserte Methode, um die Größe eines Arrays zu erhalten

In dieser Funktion ist es das, was ich nutzen, um noch die Größe des Arrays zu erhalten

size_t iSize = 0; 
while (s[iSize] != '\0'){ iSize++; } 

Ich suche eine bessere Methode zu finden, dies zu tun. Ich habe schon versucht int 'iSize = sizeof (s)/sizeof (s [0]).

+0

Mögliche Duplikate von [Konvertieren einer hexadezimalen Zeichenkette in eine ganze Zahl effizient in C?] (Http://stackoverflow.com/questions/10324/convert-a-hexadecimal-string-to-an-integer-efficiently-in- c) – Matt

+2

Um die Länge einer nullterminierten Zeichenfolge zu finden, verwenden Sie 'strlen'. Basierend auf Ihrer Beschreibung ist das was Ihnen wichtig ist, nicht die Größe des Arrays. –

+2

Haben Sie darüber nachgedacht, Ihre ganze Funktion zu ersetzen, die eine Hex-Zeichenfolge in eine Zahl mit einer Funktion 'strtol' konvertiert? – Matt

Antwort

0

Größe des Arrays wird nicht durch eine Funktion übergeben. Beispiel:

int my_getsize(int* ptr) 
{ 
    return sizeof(ptr); 
} 

int main() 
{ 
    int arr[100]; 
    printf("%d\n", sizeof(arr)); //output: 400 
    printf("%d\n", my_getsize(arr)); //output: 4 
} 

In einem 32-Bit-System my_getsize(buf) 4 liefert, die die Größe des Zeigers ist. Während sizeof(buf) 400 zurückgibt, ist das 100 * sizeof(int) (auch 4). Der einzige Weg dazu ist, die Array-Größe an die Funktion zu übergeben. Beispiel: foo(arr, sizeof(arr)/sizeof(arr[0]))

Zeichenarrays sind ein Sonderfall, da die Zeichenfolge nullterminiert ist. Sie können nach der letzten Null im Array suchen. Beachten Sie jedoch, dass dies die Array-Größe, die den Null-Terminator enthält, nicht zurückgibt. Es ist das gleiche wie strlen. Beispiel:

size_t my_strlen(char* ptr) 
{ 
    size_t iSize = 0; 
    while (*ptr++) iSize++; 
    return iSize; 
} 

Für char buf[] = "12345", sizeof(buf) 6 ist, während strlen(buf) 5. ist in der Regel müssen Sie nicht über die Optimierung mit dieser Art von einfachen Funktionen sorgen, weil der Compiler für Sie tut es.

Verwandte Themen