2016-05-09 10 views
0

Ich habe den folgenden Code:Strlen nicht wieder den richtigen Wert mit Zeiger auf ein Array

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 
realtor_command[0]="test_string" 
realtor_command[1]="next_test_string" 

Wenn ich strlen(realtor_command[0]) verwende ich einen falschen Wert zu erhalten, las ich in vorherigen Fragen dies geschieht, weil seine ein Array und nicht Zeiger, aber ich habe keine Lösung für dieses Problem gefunden.

Meine Frage ist, wenn es sowieso die Länge von realtor_command[i] zu bekommen?

Vielen Dank.

EDIT:

Dies ist, wie ich rufe Strlen:

char* matrix=malloc(strlen(realtor_command[8])+1); 
+2

Zeigen Sie, wie Sie rufen 'strlen', bitte, zusammen mit dem falschen Wert. – Downvoter

+8

Was zum Teufel ist 'sizeof (120)' ?? Sie reservieren _much weniger_ Speicher als 120 Bytes. – ForceBru

+2

Das wäre sizeof (int), entweder 4 oder 8. –

Antwort

3

In diesem Code:

char* realtor_command[120]; 
for(int i=0;i<REALTOR_MAX_COMMAND_LENGTH;i++){ 
    realtor_command[i]=malloc(sizeof(120)); 
} 

Sie ein Array von 120 Strings erstellen, dann Schleife durch REALTOR_MAX_COMMAND Strings (vermutlich dies sollte 120?) sein und sie auf neu zugewiesene 4- oder 8-Byte-Strings setzen (sizeof(120) bedeutet sizeof(int), was entweder 4 oder 8 Bytes ist). Da diese Zeichenfolgen neu zugewiesen werden, enthalten sie beliebige Daten und enden möglicherweise nicht mit einem Nullabschlusszeichen.

Dies ist wichtig, weil strlen() nur eine Schleife über die Zeichenfolge bis zum Auffinden eines Null-Terminators, so dass es nicht mit nicht-nullterminierten Zeichenfolgen arbeiten kann.

Sie könnten einen Null-Terminator selbst hinzufügen, aber dann enthalten die Strings beliebigen Müll bis zum Ende der Zeichenfolge, und sie können Null-Terminatoren in ihnen haben. Man könnte sie mit einem Null-Terminator machen beginnen, aber dann würde strlen() immer wieder zurückkehren 0.

Was könnte besser sein, diese Strings zuzuweisen ist, wenn man sie tatsächlich füllen, und lassen Sie sie als Null-Zeiger bis dahin:

char* realtor_command[120]; 
for (int i = 0; i < 120; i++) { 
    realtor_command[i] = NULL; 
} 

char input_buffer[REALTOR_MAX_COMMAND]; 

// Read in one string, then copy it so we can re-use the buffer 
fgets(input_buffer, REALTOR_MAX_COMMAND, stdin); 
realtor_command[0] = strdup(input_buffer); 

Dies wird auch den Speicherverlust in Ihrem Code vermeiden.

Beachten Sie, dass Sie wahrscheinlich die Zeichenfolge gelesen von fgets enthält eine neue Zeile sicherstellen möchten, unbedingt die Eingabe passen in Puffer zu machen:

if (strstr(input_buffer, "\n") == NULL) { 
    // error, input didn't fit in our buffer! 
} 
Verwandte Themen