我是关于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有完整的主要内容。
答案 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;
}
答案 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;
}