使用指针实现strcat

时间:2013-08-23 08:25:06

标签: c

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

#include<stdio.h>
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<stdio.h>
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函数上也犯了一些错误。

2 个答案:

答案 0 :(得分:11)

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&gt; 2.7,那么您可以通过这种方式在scanf()中使用“%ms”:

scanf("%ms",&s1);

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

2)您必须在

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

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

之前,应该在'\0'元素中指向s指针

答案 1 :(得分:7)

您没有为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完成工作时,

最近明确释放()内存。

另外,使用scanf()函数来代替不安全的fgets(),以避免缓冲区溢出错误。阅读Reading a line using scanf() not good?