2017-04-18 126 views
2

我試圖讓只是電話號碼的字符串傳遞到getPhoneNumber(char [] str),但由於某種原因,我得到一些隨機字符附加到它,每次我跑代碼,請我需要幫助。從字符串意外的返回值

源代碼

#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); 

} 

我還打印出單個數值臨時strPtr的進行調試,但返回的值似乎確定。 程序的輸出顯示在下圖中。

enter image description here

+4

'strncpy()'儘管它的名字不是用來處理* strings *。它不關心* strings *的強制終止''\ 0''。你應該在調用之後自己添加''0''字節,或者使用其他函數。在計算結果數組的大小時,您還需要考慮該終止字節。 – pmg

+0

但是當我嘗試在[ideone](http://ideone.com/FOQi4V)上運行它時,我得到了預期的輸出結果。 –

+2

以文字形式發佈文字優於以文字形式發佈爲圖片。 – chux

回答

5

您沒有爲phone_num預留足夠的空間。結果,printf正在讀取數組的末尾。這調用undefined behavior。這就是爲什麼你在本地運行時看到額外的字符,但它似乎在ideone上正常工作(它也似乎運行良好)。

您需要多一個字節作爲字符串的空終止字符。此外,由於phone_num_len字節temp內沒有空終止符,所以您需要手動添加空終止符,因爲strncpy函數不會爲您執行此操作。

char phone_num[phone_num_len+1]; 

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

非常感謝@dush,它的工作正常。 –

1

從手冊頁strncpy(char * dst, const char * src, size_t len)

如果src爲小於len個字符長,DST的其餘部分充滿了'\ 0' 字符。否則,dst不會終止。

因此,它不是,正如你似乎期望的,終止你正在複製的「字符串」。