繁体   English   中英

用指针编写strcat()函数

[英]Write strcat() function with pointers

我是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));

现在可以正常工作,因为最终结果是一个奇怪的角色。 我该如何修复该功能? 是完整的主体。

从实现中可以看出,您的strcat版本与标准版本兼容,因为您希望为结果分配内存,而不是期望调用方为您提供足够的内存以适合串联结果。

您的代码有几个问题:

  • 您需要返回char* ,而不是char
  • 您需要使用malloc动态分配内存; 您不能返回本地分配的数组。
  • 您需要为空终止符加1
  • 您需要将空终止符写入结果
  • 您可以将两个参数都用作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;
}
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;
}

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

代替

char c[h];

采用

char *c = malloc(h);

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

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

最后:

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

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

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

根据我自己的建议(并发现另一个错误,这是第二个for循环未遍历正确索引的事实),您最终得到以下程序:

#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;
}

您会得到一个错误

期望常数表达式

对于代码行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;    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM