【问题标题】:Unexpected return value from string来自字符串的意外返回值
【发布时间】:2017-04-18 16:52:57
【问题描述】:

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

}

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

【问题讨论】:

  • strncpy() 尽管它的名字不是为使用 strings 而设计的。它不关心 strings 的强制终止 '\0'。您应该在调用后自己添加 '\0' 字节,或使用其他函数。在计算结果数组的大小时,您还需要考虑该终止字节。
  • 但是当我尝试在ideone 上运行它时,我得到了预期的输出。
  • 以文本形式发布文本优于以图片形式发布文本。
  • @lilfancy 所以那里 碰巧 是一个方便的终止 0。
  • 著名的@chux

标签: c function runtime


【解决方案1】:

您没有为phone_num 留出足够的空间。因此,printf 正在读取超出数组末尾的内容。这会调用undefined behavior。这就是为什么你在本地运行时会看到额外的字符,但它似乎在 ideone 上运行良好(它对我来说似乎也运行良好)。

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

char phone_num[phone_num_len+1];

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2015-11-10
      • 2012-12-05
      相关资源
      最近更新 更多