使用指针实现strcat

在对字符串做一些程序时,我遇到了这个小问题。 向我询问的问题是这样的 – 写一个函数strcat(s,t)的指针版本,它将字符串t复制到s的末尾。 我写了这个程序 –

#include void strcat(char *s, char *t); int main() { char *s1, *s2; printf("enter the first string\n"); scanf("%s",s1); printf("Enter the second string\n"); scanf("%s",s2); strcat(s1,s2); printf("Strings concatenated\n"); printf("%s",s1); return 0; } void strcat(char *s, char *t) { while(*s++) ; while(*s++ = *t++) ; } 

我知道我做过一些事情(或很多事情)非常错误。 因为无论何时我尝试运行此代码 – 它都会给我分段错误。 像这样-

输入第一个字符串

你好

输入第二个字符串

分段故障(核心转储)

如果有人指出我实施的缺陷/缺陷,那将是非常有帮助的。 提前致谢。

非常感谢你们,快速回复。 但似乎这不是唯一的问题。 写完这样的程序后 –

 #include void strcat(char *s, char *t); int main() { char s1[20], s2[20]; printf("enter the first string\n"); scanf("%s",s1); printf("Enter the second string\n"); scanf("%s",s2); strcat(s1,s2); printf("Strings concatenated\n"); printf("%s",s1); return 0; } void strcat(char *s, char *t) { while(*s++) ; while(*s++ = *t++) ; } 

它像这样运行。

输入第一个字符串

你好

输入第二个字符串

那里

你好

它只打印我输入的第一个字符串。 现在我觉得我在strcat函数上也犯了一些错误。

1)在main() ,你必须为s1s2指针分配内存

 char *s1=malloc(100*sizeof(char)), *s2=malloc(100*sizeof(char)); scanf("%99s",s1); //the "%99s" allow to avoid buffer overflow 

如果您使用gcc和gcc> 2.7,那么您可以通过这种方式在scanf()中使用“%ms”:

 scanf("%ms",&s1); 

使用"%ms"scanf()将为s1指针分配内存

2)你必须添加s-- in

 while(*s++) ; s--; // add s-- here while(*s++ = *t++) ; 

因为s指针指向'\0'元素的下一个元素。 在开始复制第二个字符串之前,应该在'\0'元素中指向s指针

你没有为s1s1 (或用数组初始化)分配内存, s1s1值都是垃圾。

 char *s1, *s2; printf("enter the first string\n"); scanf("%s",s1); 

这会导致未定义的行为。

建议使用:

 #define SIZE 1024 char s1[SIZE], s2[SIZE]; 

或使用calloc()/ maloc()函数动态分配内存:

 char *s1, *s2; s1 = malloc(SIZE); s2 = malloc(SIZE); 

当使用s1s2完成工作时,最近显式地释放了free()内存。

另外,而不是不安全的scanf()使用fgets()函数来避免缓冲区溢出错误。 读取使用scanf()读取一行不好?