来自字符串的意外返回值

时间:2017-04-18 16:52:57

标签: c function runtime

我试图从传递到 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);

}

我还打印出 temp strPtr 的各个值用于调试目的,但返回的值似乎没问题。 程序的输出如下图所示。

enter image description here

2 个答案:

答案 0 :(得分:5)

你没有为@ModelAttribute留出足够的空间。结果,phone_num正在读取数组的末尾。这会调用undefined behavior。这就是为什么你在本地运行时看到额外的字符,但它似乎在ideone上工作正常(它似乎也适合我)。

字符串的空终止字符需要多一个字节。此外,您需要手动添加该空终止符,因为printf函数不会为您执行此操作,因为strncpy字节phone_num_len内没有空终止符。

temp

答案 1 :(得分:1)

来自strncpy(char * dst, const char * src, size_t len)的手册页:

  

如果src长度小于len个字符,则dst的剩余部分用“\ 0”字符填充。否则,dst不会终止。

因此,正如您所期望的那样,它不会终止您正在复制的“字符串”。