我写了这段代码而没有在网上查看并查看内置版。
如何删除那个临时变量并直接写入strcat12()中传递的变量之一?
#include <stdio.h>
char temp[]="";
int strlen12(char *str) {
int count = 0;
while(*str) {
count++;
str++;
}
return count;
}
char strcat12(char *str, char *str2) {
int i = 0;
int l = strlen12(str);
while(*str) {
temp[i++] = *str;
str++;
}
while(*str2) {
temp[l++] = *str2;
str2++;
}
}
答案 0 :(得分:2)
代码有一些错误,也有一些符合标准的地方。
strlen
函数返回字符串的长度。如果您返回size_t
并且参数类型为const char*
,则会更好。
现在strcat
的行为与您实施的方式不同。那么会发生什么?标准说
char *strcat(char * restrict s1, const char * restrict s2);
strcat
函数将s2
指向的字符串副本(包括终止空字符)附加到s1
指向的字符串的末尾。 s2
的初始字符将覆盖s1
末尾的空字符。如果在重叠的对象之间进行复制,则行为未定义。
返回
strcat
函数返回s1
的值。
char * mystrcat(char *dest, const char *src)
{
size_t i=0,j=0;
while( dest[i] ) i++ ;
while( src[j] ) { dest[i+j] = src[j]; j++; }
dest[i+j] = '\0';
return dest;
}
strlen()
返回size_t
的方式相同。
size_t strlen(const char *s){
size_t len = 0;
for( ; s[len] ; len++ )
;
return len;
}
现在代码中的问题
char temp[]=""
这是一个只包含单个字符\0
的长度字符串。
当用2个字符串调用时,有一个函数可以填充char
数组之一,这不是一个好主意。这种副作用是不可取的,并且不可重复使用。
char strcat12(char *str, char *str2)
你应该返回一个char
,但你没有返回任何内容。
char strcat12(char *str, char *str2)
为什么要返回char
?
现在,如果你正在使用全局变量,为什么你甚至需要返回任何代码给出的代码。 void strcat12(char *str, char *str2)
即可。
稍微好一点的想法是,您将返回包含连接字符串的char*
。我的意思是你将分配内存并返回指向该内存的指针,内存中包含连接字符串。
答案 1 :(得分:0)
关于你的问题:如何删除那个临时变量并直接写入strcat12()中传递的变量之一?
直接写入参数&#39; str&#39;,&#39; str&#39;指向的数组必须足够长以保存两个参数的内容+终止NUL字节。
然后不需要引用变量temp[]
。
这是实现strcat12()
功能的一种方法:
char * strcat12(char *dest, const char *src)
{
size_t i;
for (i = 0; dest[i]; i++);
for (size_t j = 0; src[j]; j++)
dest[i+j] = src[j];
dest[i+j] = '\0';
return dest;
}