2017-04-18 4 views
2

Ich versuche, nur die Telefonnummer aus der Zeichenfolge in getPhoneNumber (char [] str), aber aus irgendeinem Grund, bekomme ich einige zufällige Zeichen jedes Mal, wenn ich laufe der code, bitte ich brauche hilfe.Unerwarteter Rückgabewert von String

Quellcode

#include <stdio.h> 
#include <string.h> 


char* getPhoneNumber(char str[]); 

int main(){ 

    getPhoneNumber("AT+CMGR=5 \n+CMGR: \"REC READ\",\"+9349036332058\",\"samuel\",\"17/03/31,20:44:52+04\"\nHOW THINS fa OK"); 

    return 0; 
} 

char* getPhoneNumber(char str[]){ 

    char *temp = strchr(str, ',')+2; 
    const unsigned short len1 = strlen(temp); 

    printf("value in temp : %s\n\n",temp); 

    char *strPtr = strchr(temp, '\"'); 
    const unsigned short len2 = strlen(strPtr); 

    printf("value in strPtr : %s\n\n",strPtr); 
    int phone_num_len = len1-len2; 

    char phone_num[phone_num_len]; 

    strncpy(phone_num, temp,phone_num_len); 

    printf("Phone number : %s",phone_num); 

} 

ich auch einzelne Werte von Temp und StrPtr für Debugging-Zwecke ausgedruckt, aber die zurückgegebenen Werte scheint ok. Die Ausgabe des Programms wird in der Abbildung unten gezeigt.

enter image description here

+4

'strncpy()' trotz seines Namens wurde nicht entworfen, um mit * Strings * zu arbeiten. Es ist nicht wichtig, dass das abschließende '\ 0'' für * Strings * obligatorisch ist. Sie sollten das Byte selbst nach dem Aufruf hinzufügen oder eine andere Funktion verwenden. Sie müssen dieses abschließende Byte bei der Berechnung der Größe des Ergebnisarrays berücksichtigen. – pmg

+0

aber wenn ich es auf [ideone] (http://ideone.com/FOQi4V) laufen lasse, bekomme ich die erwartete Ausgabe. –

+2

Post-Text als Text wird gegenüber dem Buchungstext als Bild bevorzugt. – chux

Antwort

5

Sie reservieren nicht genügend Platz für phone_num. Als Ergebnis liest printf nach dem Ende des Arrays. Dies ruft undefined behavior auf. Deshalb sehen Sie zusätzliche Zeichen, wenn Sie lokal laufen, aber es scheint auf ideone gut zu funktionieren (es scheint auch gut für mich zu laufen).

Sie benötigen ein weiteres Byte für das nullende Zeichen für die Zeichenfolge. Außerdem müssen Sie diesen Null-Terminator manuell hinzufügen, da die strncpy-Funktion dies nicht für Sie erledigt, da innerhalb von phone_num_len Bytes von temp kein Null-Terminator vorhanden ist.

char phone_num[phone_num_len+1]; 

strncpy(phone_num, temp,phone_num_len); 
phone_num[phone_num_len] = '\0'; 
+0

vielen dank @dush, es funktioniert gut. –

1

Aus der Manpage für strncpy(char * dst, const char * src, size_t len):

Wenn src lange weniger als len Zeichen ist, wird der Rest von dst mit `\ 0' Zeichen gefüllt. Andernfalls wird dst nicht beendet.

Es ist also nicht, wie Sie zu erwarten scheinen, die "Zeichenfolge" zu beenden, die Sie kopieren.

Verwandte Themen