这段代码是否需要优化?我编写的代码没有任何参考,只有数据结构知识

时间:2017-11-23 15:42:40

标签: c string

我写了这段代码而没有在网上查看并查看内置版。

如何删除那个临时变量并直接写入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++;
}   
}

2 个答案:

答案 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;
}