字符串

时间:2017-04-29 16:40:36

标签: c arrays string pointers

这里调用函数

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 - 甲虫?

2 个答案:

答案 0 :(得分:3)

sizeof(s)将返回指针的大小,即4或8字节。并且sizeof(*s)将返回char的大小(因为schar*),这是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)

  1. 使用strlen(s)计算字符串的长度。
  2. 您希望终止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;
    }