来自字符串的意外 return 值

Unexpected return value from string

我试图从传递给 getPhoneNumber(char[] str) 的字符串中获取 phone 数字,但由于某种原因,我得到了一些每次我 运行 代码时都会附加随机字符,我需要帮助。

源代码

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

}

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

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

If src is less than len characters long, the remainder of dst is filled with `[=11=]' characters. Otherwise, dst is not terminated.

所以它并没有像您预期的那样终止您正在复制的 "string"。

您没有为 phone_num 预留足够的 space。结果,printf 读取到数组末尾。这会调用 undefined behavior。这就是为什么在本地 运行ning 时你会看到额外的字符,但它似乎在 ideone 上工作正常(它似乎 运行 对我来说也很好)。

字符串的空终止字符还需要一个字节。此外,您需要手动添加该空终止符,因为 strncpy 函数不会为您执行此操作,因为 temp.

phone_num_len 字节内没有空终止符
char phone_num[phone_num_len+1];

strncpy(phone_num, temp,phone_num_len);
phone_num[phone_num_len] = '[=10=]';