这里调用函数
printf(" copy%s \ n",string_dupe(s1));
,功能是
char* string_dupe(char *s){
char* new_s;
new_s = malloc(8 * sizeof(s));
int i;
for (i = 0; i < size_of(s); i++){
new_s[i] = s[i];
}
s[i] = '\0';
return new_s;
}
所以我创建了NULL字节,或者我至少认为我有。但每当我运行时,这会在输入字符串的末尾不断获取随机值。我把它周围的语句检查第i个值,它似乎是一个空字节。我也检查下一个i + 1元素,它与显示的值永远不同,任何人都可以帮助我吗?
示例输入 s [] =&#34;甲虫&#34;
ouput - 甲虫?
答案 0 :(得分:3)
sizeof(s)
将返回指针的大小,即4或8字节。并且sizeof(*s)
将返回char的大小(因为s
是char*
),这是1个字节。要获取字符串的长度,必须对其进行迭代,直到达到\0
或使用strlen
。
char* string_dupe(char *s){
unsigned int len = 0;
while (s[len] != '\0') ++len; // conpute length of string
char* new_s = (char*) malloc(len + 1); // one extra byte for '\0'
unsigned int i;
for (i = 0; i < len; ++i){
new_s[i] = s[i];
}
new_s[i] = '\0'; // Append '\0' to new_s not s
return new_s;
}
答案 1 :(得分:2)
strlen(s)
计算字符串的长度。您希望终止new_s
指向的字符串'\0'
而非s
。
char* string_dupe(char *s)
{
char* new_s;
size_t len = strlen(s);
new_s = malloc(len+1);
if (new_s != NULL)
strcpy(new_s,s);
return new_s;
}