我必须比较字符串的几个字符,从第二个字符到第四个字符(从零开始计数)
该字符串存储在结构元素中,例如zoopla-> real
例如,zoopla - > real有'447889036',其中real是char real类型[20];
另请注意我不能使用函数strnstr。
代码按预期工作但只是为了好奇,我添加了printf语句,它显示了我的价值直到第四个cahr然后一些garabe字符。
我想知道为什么printf语句显示2个额外的garabe值?
char * copyTemp;
char *strptr;
copyTemp = (char *)malloc(sizeof(char)*6);
strncpy(copyTemp, zoopla->real, 5);
printf("the string copied is %s", copyTemp); // debug statemnt
strptr = strstr(copyTemp, "666");
if(strptr != NULL)
{
//some other function
}
else
//some other function
free(copyTemp);
欢迎所有批评和建议
答案 0 :(得分:3)
在我看来,copyTemp
不会被终止。这就是为什么printf
会在你输入的字符后显示垃圾字符的原因。它不知道在哪里停止所以它继续迭代通过内存。
添加
copyTemp[5] = '\0';
在strncpy
之后。
请参阅strncpy
的文档中的此示例:
/* strncpy example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]= "To be or not to be";
char str2[6];
strncpy (str2,str1,5);
str2[5]='\0';
puts (str2);
return 0;
}
答案 1 :(得分:1)
根据我以前的旧K&amp; R,如果源字符串的字符数少于要复制的字符数,strncpy
将只隐式添加空字节。
在这种情况下,zoopla->real
有超过5个字符,因此该功能只是复制前五个字符。由于您尚未将内存初始化为零,或者显式添加了空字节,因此字符串不会在第五个字符后终止。因此,当您打印字符串时,您将获得具有基本随机值的其他字节,直到其中一个字符串恰好为零。
答案 2 :(得分:1)
见 http://www.cplusplus.com/reference/clibrary/cstring/strncpy/ 没有空字符隐式附加到目标的末尾,因此如果源中的C字符串的长度小于num,则目标将仅以空值终止。
你必须添加null自己。
如果要分配常量大小的内存,则只使用数组。
#include <stdio.h>
#include <string.h>
int main ()
{
char * copyTemp;
char *strptr;
copyTemp = (char *)calloc(sizeof(char),6);
strncpy(copyTemp, "88666782921", 5);
printf("the string copied is %s", copyTemp); // debug statemnt
strptr = strstr(copyTemp, "666");
if(strptr != NULL)
{
//some other function
}
else
//some other function
free(copyTemp);
return 0;
}