用指针编写strcat()函数

时间:2013-12-10 13:33:38

标签: c

我是关于C的指针的新手,我正在尝试编写像strcat()这样的函数但不使用它。我开发了以下功能:

char cat(char *a, char *b) {
 int i=0,cont=0,h=strlen(a)+strlen(b);
 char c[h]; //new string containing the 2 strings (a and b)

 for(i;i<strlen(a);++i) {
  c[i] = *(a+i); //now c contains a      
 }

 int j = i;

 for(j;j<strlen(b);++j) {
  c[j] = *(b+cont); //now c contains a + b
  cont++;       
 }

 return c; // I return c  
}

这就是我调用函数的方式:

  printf("\Concatenazione: %c", cat(A,B));

它现在正在工作,因为最终结果是一个奇怪的角色。我怎么能修复这个功能? Here有完整的主要内容。

5 个答案:

答案 0 :(得分:2)

从您的实现中看来,您的strcat版本不兼容,因为您希望为结果分配内存,而不是期望调用者提供你有足够的记忆力来适应连接的结果。

您的代码存在以下问题:

  • 您需要返回char*,而不是char
  • 您需要使用malloc动态分配内存;你不能返回一个本地分配的数组。
  • 您需要为null终止符添加1
  • 您需要将null终止符写入结果
  • 您可以将这两个参数都设为const char*
  • 您可以使用指针而不是索引来简化您的功能,但该部分是可选的。

以下是修补方法:

char *cat(const char *a, const char *b) {
    int i=0,cont=0,h=strlen(a)+strlen(b);
    char *c = malloc(h+1);
    // your implementation goes here
    c[cont] = '\0';
    return c;
}

答案 1 :(得分:2)

char * strcat(char *dest, const char *src)
{
    int i;
    int j;

    for (i = 0; dest[i] != '\0'; i++);
    for (j = 0; src[j] != '\0'; j++) {
        dest[i+j] = src[j];
    }

    dest[i+j] = '\0';

    return dest;
}

答案 2 :(得分:1)

c是一个局部变量。它只存在于函数cat中。您应该使用malloc

而不是

char c[h];

使用

char *c = malloc(h);

此外,您应该在末尾添加空字节。请记住,C中的字符串是空的。

h = strlen(a) + strlen(b) + 1;

最后:

c[h - 1] = '\0';

猫的签名应为char *cat(char *a, char *b);

答案 3 :(得分:1)

您正在向字符串返回一个POINTER,而不是实际的字符串本身。您需要将返回类型更改为“char *”(或类似的东西)。您还需要确保null终止字符串(附加'\ 0')以使其正确打印。

根据我自己的建议(并且还发现另一个错误,即第二个for循环没有循环遍历正确的索引),最终得到以下程序:< / p>

#include <stdio.h>

char *cat(char *a, char *b) {
  int i = 0, j = 0;
  int cont = 0;
  int h = strlen(a) + strlen(b) + 1;

  char *result = (char*)malloc(h * sizeof(char));

  for(i = 0; i < strlen(a); i++) {
    result[i] = a[i];
  }

  for(j = i; j < strlen(b)+ strlen(a); j++) {
    result[j] = b[cont++];
  }

  // append null character
  result[h - 1] = '\0';
  return result;
}

int main() {
   const char *firstString = "Test First String. ";
   const char *secondString = "Another String Here.";
   char *combined = cat(firstString, secondString);

   printf("%s", combined);

   free(combined);
   return 0;
}

答案 4 :(得分:1)

您将收到错误

  

预期的常量表达式

代码行char c[h];。相反,您应该使用malloc在运行时分配任何动态内存,如::

char* c ;
c = malloc( h + 1 ) ; // +1 for the terminating null char
// do stuff
free( c ) ;

您的更正代码::

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include <stdlib.h>

char* cat(char *a, char *b) {
 int i=0,cont=0,h=strlen(a)+strlen(b), j;
 char *c;

 c = malloc( h+1 ) ;
 for(i;i<strlen(a);++i) {
  c[i] = *(a+i);      
 }

 j = 0 ;

 for(j;j<strlen(b);++j) {
  c[i] = *(b+cont);
  i++ ;
  cont++;      
 }

 c[i] = 0 ;

 return c;    
}

int main() {

  char A[1000],B[1000];
  char * a ;

  printf("Inserisci la stringa 1: \n");
  gets(A);
  printf("Inserisci la stringa 2: \n");
  gets(B);
  a = cat(A,B) ;
  printf("\nConcatenazione: %s", a);

  free(a) ;

 getch();
 return 0;    
}