来自字符串的意外 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);
}
为了调试目的,我还打印了 temp 和 strPtr 的各个值,但返回值似乎没问题。
程序的输出如下图所示。
来自 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=]';
我试图从传递给 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);
}
为了调试目的,我还打印了 temp 和 strPtr 的各个值,但返回值似乎没问题。 程序的输出如下图所示。
来自 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=]';