C 型字符串作业

C-style String Homework

本文关键字:作业 字符串      更新时间:2023-10-16

我的C++类正在研究 C 样式的字符串并使用指针。我要编写一个具有三个参数的函数:char * s1、const char * s2 和 size_t max,它表示 s1 缓冲区的最大大小。我将把 s2 中的字符附加到 s1 的末尾。说明建议我确保组合字符的末尾只有一个"\0",并且我不要超出要求复制到的缓冲区的末尾。该函数将返回指向 s1 中第一个字符的指针。

我无法使用标准库中的任何函数。我可以使用的是指针、指针算术或数组表示法。

我已经开始了,但不知道该去哪里。

const char * myFunction (char * s1, const char * s2, size_t max)
{
    char * begin = s1;
    while (*s1) s1++;
    while ((s1 < begin + max - 1) && (*s2 != '')) {
      *s1++ = *s2++;     
    }
    return s1;
}

不知道到达 s1 结束时该怎么做。如何将 s2 放在 s1 的末尾?

我无法使用标准库中的任何函数。

我认为唯一需要的是strlen()。自己动手:

#define min(a,b) ((a) < (b)) ? (a) : (b)
size_t str_length(const char* s)
{
    size_t len = 0;
    for( ; *s; ++s, ++len);
    
    return len;
}
const char * append (char * s1, const char * s2, size_t max)
{
    if(!s1 || !s2) //If either of strings is NULL, nothing to be done
        return s1;
        
    size_t s1_length = str_length(s1);
    
    if(s1_length < max - 1) //If there is a room in s1...
    {
        size_t s2_length = str_length(s2); //Get length of s2
        size_t append_size = min(s2_length, max - s1_length - 1); //Make sure we won't copy more than buffer can hold
        
        if(append_size > 0)
        {
            memcpy(s1 + s1_length, s2, append_size); //This will overwrite null terminator in 's1'
            s1[s1_length + append_size] = 0;
        }
    }
    return s1;
}

测试:

int main(void)
{
    char dest[64] = "This is a test";
    
    append(dest, " of strings appending", 64);
    printf("%s (length: %d)n", dest, str_length(dest));
    
    append(dest, " of appending too long string, that will probably not fit inside destination buffer", 64);
    printf("%s (length: %d)n", dest, str_length(dest));
    
    return 0;
}

输出:

这是字符串附加的测试(长度:35)

这是附加太

长字符串的测试(长度:63)

这是工作示例。