从字符串意外的返回值

问题描述:

我试图让只是电话号码的字符串传递到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

您没有为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,它的工作正常。 –

从手册页strncpy(char * dst, const char * src, size_t len)

如果src为小于len个字符长,DST的其余部分充满了'\ 0' 字符。否则,dst不会终止。

因此,它不是,正如你似乎期望的,终止你正在复制的“字符串”。