C 型字符串作业
C-style String Homework
我的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)
这是工作示例。