我必须在C中创建标准库的一些元素的副本,我必须创建一个strcat的副本。所以我必须创建一个在C中连接两个字符串的函数。我知道C中的数组不能改变分配的大小。我允许使用的唯一功能是我使用strlen,strstr和write()创建的副本......我的代码如下所示:
char *my_strcat(char *dest, char *src)
{
int dest_size;
int src_size;
int current_pos;
int free_space;
int pos_in_src;
src_size = my_strlen(src);
dest_size = my_strlen(dest);
while (dest[current_pos] != '\0')
current_pos = current_pos + 1;
free_space = dest_size - current_pos;
if (free_space < src_size)
return (0);
while (src[pos_in_src] != '\0')
{
dest[current_pos] = src[pos_in_src];
pos_in_src = pos_in_src + 1;
current_pos = current_pos + 1;
}
return (dest);
}
但我不知道如何在主要声明我的dest和src。 我不知道如何创建一个大尺寸的数组,将其声明为一个字符串,如dest =&#34; Hello \ 0&#34;但是这个数组仍然必须包含6个以上的字符。
你能帮我吗?
答案 0 :(得分:2)
char dest[19] = "epite";
char *src = "chor42spotted";
my_strcat(dest, src);
另请阅读man
strcat(3)
dest字符串必须有足够的空间用于结果。
https://linux.die.net/man/3/strcat
因此,您的功能行为不正确,您无需检查dest
答案 1 :(得分:1)
你想要一个函数mystrcat,其行为与stdlib strcat完全相同。
所以原型是
/*
concatenate src to dest
dest [in / out] - the string to add to (buffer must be large enough)
src [in] - the string to concatenate.
Returns: dest (useless little detail for historical reasons).
*/
char *mystrcat(char *dest, const char *src);
现在我们称之为
int main(void)
{
char buff[1024]; // nice big buffer */
strcpy(buff, "Hello ");
mystrcat(buff, "world");
/* print the output to test it */
printf("%s\n", buff);
return 0;
}
但我不会为你写mystrcat。这会使你的家庭作业毫无意义。
答案 2 :(得分:1)
数组的第一个参数必须足够大才能包含两个字符串+一个空终止符。因此,如果您有"hello"
和"world"
,则需要5 + 5 +1 = 11个字符。例如:
#define LARGE_ENOUGH 11
int main (void)
{
char str[LARGE_ENOUGH] = "hello";
my_strcat(str, "world");
puts(str); // gives "helloworld"
}
在实际应用程序中,您通常会为数组分配相同的大数(几百个字节)或基于strlen调用的长度。
至于实施本身,你的解决方案是不必要的复杂。请注意,真实的strcat
会将所有错误检查留给调用者。它最有可能像这样实现:
char* strcat (char* restrict s1, const char* restrict s2)
{
return strcpy(&s1[strlen(s1)], s2);
}
这里最重要的部分是注意s2参数的const正确性。
restrict关键字只是来自C标准的微优化,它告诉编译器它可以假设指针指向不同的内存区域。
如果您希望推出自己的版本而没有库函数调用只是为了好玩,它仍然相当容易,您只需要两个循环。也许是这样的事情:
char* lolcat (char* restrict s1, const char* restrict s2)
{
char* s1_end = s1;
while(*s1_end != '\0') // find the end of s1
{
s1_end++;
}
do // overwrite the end of s1 including null terminator
{
*s1_end = *s2;
s1_end++;
s2++;
} while(*s1_end != '\0'); // loop until the null term from s2 is copied
return s1;
}