使用指针实现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()
,你必须为s1
和s2
指针分配内存
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指针
你没有为s1
, s1
(或用数组初始化)分配内存, s1
, s1
值都是垃圾。
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);
当使用s1
, s2
完成工作时,最近显式地释放了free()内存。
另外,而不是不安全的scanf()
使用fgets()
函数来避免缓冲区溢出错误。 读取使用scanf()
读取一行不好?