2013-12-10 22 views
0

我是新的C指针,我试图编写一个函数,如strcat(),但不使用它。我制定了以下功能:用指针编写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有完整的主体。

+1

['strcat'(HTTP:// EN .cppreference.com/w/c/string/byte/strcat)不会返回'char' ... –

+0

收听编译器的警告; gcc说,*返回从指针没有转换的整数。*你不能从返回'char'的函数返回一个字符数组。 – user4815162342

+1

我不明白为什么4个答案是使用'malloc'。 'strcat'将源复制到dest并返回dest。 malloc不应该在这里适用。 – Duck

回答

1

您在返回字符串指针,而不是实际字符串本身。您需要将返回类型更改为“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; 
} 
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);

+0

好一个:)它的工作原理 –

2

从你的实现看来,你的版本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; 
} 
+2

新来自C++:P – Marco

+0

@Marco谢谢! (当你看到这样愚蠢的错误时,随意编辑)。 – dasblinkenlight

+0

是的,我必须使用C –

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;  
} 
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; 
} 
+1

如果你传递dest,那么你不需要返回它。但是这个问题的想法(在我的理解中)是将两个字符串连接成一个* new *字符串,这不是这样做的。这实际上编辑了传入例程的第一个字符串! –

+0

@drew_w,也许。 OTOH OP说他想重新创建'strcat'。 OTOH他的实施要么故意创造别的东西(一个新的字符串),要么他的尝试出错,大部分答案都遵循了这个目标。这个答案与'strcat'的作用和行为预期最接近。 – Duck