2

我是 C 语言的初学者。我想使用指针创建 strcat 函数。我做到了,但不知道有什么问题。我使用了 gcc 编译器,它给出了分段错误输出。

#include<stdio.h>
#include<string.h>

char scat(char *,char *);

void main()
{
    char *s="james";
    char *t="bond";

    char *q=scat(s,t);
    while(*q!='\0') printf("the concatenated string is %c",*q);
}

char *scat(char *s,char *t)
{
    char *p=s; 
    while(*p!='\0'){
        p++;
    } 
    while(*t!='\0'){
        *p=*t;
        p++;
        t++;
    }
    return p-s-t;
}
4

9 回答 9

8

这个有效:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *scat(char *,char *);                 /* 1: your prototype was wrong */

void main()
{
    char *s="james";
    char *t="bond";

    char *q=scat(s,t);   
    printf("cat: %s\n", q);               /* 2: you can use %s to print a string */
    free(q);
}

char *scat(char *s,char *t)
{
    char *p=malloc(strlen(s)+strlen(t)+1);    /* 3: you will have to reserve memory to hold the copy. */
    int ptr =0, temp = 0;                   /* 4 initialise some helpers */

    while(s[temp]!='\0'){                  /* 5. use the temp to "walk" over string 1 */
        p[ptr++] = s[temp++];
    }
    temp=0;
    while(t[temp]!='\0'){                   /* and string two */
        p[ptr++]=t[temp++];
    }
    return p;
}
于 2013-01-10T14:05:33.173 回答
3

您必须在s. 否则,您的 while loo[ 将进入您无法访问的内存中。

你应该了解malloc() 这里

于 2013-01-10T13:59:54.313 回答
3

修改字符串文字是未定义的行为s,并且最终p指向字符串文字:

char* s = "james";

sscat()作为分配给本地的第一个参数传递char* p,然后:

*p=*t;

在第一次调用时,它试图覆盖空字符和字符串文字的结尾"james"

一个可能的解决方案是使用malloc()分配一个足够大的缓冲区来包含两个输入字符串的连接:

char* result = malloc(strlen(s) + strlen(p) + 1); /* + 1 for null terminator. */

并将它们复制到其中。调用者必须记住要free()返回的char*.

您可能会发现常见的指针问题列表很有用。

于 2013-01-10T14:00:32.597 回答
2

因为 p 一直到字符串的末尾,然后它开始进入非法内存。这就是你得到分段错误的原因。

于 2013-01-10T13:59:07.323 回答
0

这是因为 s 指向“james\0”,字符串文字&你不能修改常量。

更改char *s="james";char s[50]="james";

于 2013-01-10T13:58:44.067 回答
0

您需要了解指针的基础知识。

char * 不是字符串或字符数组,它是数据开头的地址。

你不能做一个 char * - char* !

这是一个很好的教程

你将不得不使用malloc

于 2013-01-10T14:01:17.970 回答
0

您会遇到分段错误,因为您将指针移动到末尾,s然后开始将数据p直接写入内存s。是什么让你相信之后有可写内存可用s?任何将数据写入不可写内存的尝试都会导致分段错误,并且看起来后面的内存s不可写(这是可以预料的,因为“字符串常量”通常存储在只读内存中)。

于 2013-01-10T14:09:09.470 回答
0

有几件事情看起来不正常。

首先请记住,当您想要返回一个指向在函数中创建的东西的指针时,它需要在某个地方进行 malloc'ed。如果您将目标作为参数传递给函数,则容易得多。free()如果你遵循前一种方法,当你完成它时不要忘记它。

此外,函数 scat 必须在声明中返回一个指针,即char *scat不是char scat

最后,您不需要该循环来打印字符串,printf("%s", string);它将为您打印字符串(前提是它已终止)。

于 2013-01-10T14:09:30.130 回答
0

首先,由于以下行,您的代码将处于无限循环中。您应该通过包含“p++; t++”语句来使用正确的大括号。

while(*t!='\0')
 *p=*t;

尽管您确实喜欢这样做,但您正在尝试更改字符串文字的内容。这将导致未定义的行为,如分段错误。

用双引号括起来的一系列字符称为字符串文字。它也被称为“字符串”。字符串的大小是固定的。创建后,您将无法扩展其大小和更改内容。这样做会导致未定义的行为。

为了解决这个问题,您需要分配一个新的字符数组,其大小是传递的两个字符串的长度之和。然后将两个字符串附加到新数组中。最后返回新数组的地址。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char* scat(char *,char *);
void append(char *t , char *s);

int main(void)
{
    char *s="james";
    char *t="bond";

    char *n = scat(s,t);        
    printf("the concatenated string is %s",n);

    return 0;
}

char* scat(char *s,char *t)
{
    int len = strlen(s) + strlen(t);
    char *tmp = (char *)malloc(sizeof(char)* len);

    append(tmp,s);
    append(tmp,t);

    return tmp;
} 


void append(char *t , char *s)
{   
     //move pointer t to end of the string it points. 
    while(*t != '\0'){
        t++;
    }

    while( *s != '\0' ){
        *t = *s;
        t++;
        s++;    
    }       
}  
于 2013-01-10T14:36:59.403 回答