如何追加两个指针?

时间:2012-11-01 15:29:21

标签: c ansi

有人可以帮我解决这个问题。我需要将这两个指针附加在一起,但它不适用于我。代码不会将指针添加到一起。我认为* mystrcat函数是错误的。

// stringAdds.cpp : Defines the entry point for the console application.
//

char *mystrcat(char *s, char *p);

int _tmain(int argc, _TCHAR* argv[])
{
    char myChar = 0;
    int i = 0;

    char *s = (char*) malloc (1);
    char *p = (char*) malloc (1);

    printf("Input s: ");
    while ((myChar=getchar()) != '\n')
    s[i++]=myChar;
    s[i]='\0';
    //scanf("%s", &s);
    printf_s("%s", s);

    printf("\nInput p: ");
    i = 0;
    while ((myChar=getchar()) != '\n')
    p[i++]=myChar;
    p[i]='\0';
    printf_s("%s\n", p);

    printf_s("return string: %s", mystrcat(s,p));   
}

char *mystrcat(char *s, char *p)
{
    int sizeOfs = 0;
    int sizeOfp = 0;
    int sizeZero = 0;

    while(*s!='\0')
    {
        sizeOfs++;
    }
    while(*p!='\0')
    {
        sizeOfp++;
    }
    for( int i=0; i<sizeOfp; i++) 
        {
            s[sizeOfs++]=p[sizeZero++];
        }
    s[sizeOfs]='\0';

    return s;
}

5 个答案:

答案 0 :(得分:3)

由于这可能是一项功课,这里有一些提示:

内部mystrcat

  • while(*s!='\0')是一个无限循环,因为s不会在循环体内发生变化
  • 您无需知道p
  • 的大小
  • 存储s以便您可以返回其值
  • 使用循环
  • s移动到字符串的末尾
  • p个字符复制到新s指针所指向的字符,直到您点击'\0'
  • 你已经完成了

mystrcat

  • 您的mystrcat函数假定s有足够的空间来存储s的所有字符,p的所有字符以及空终止符。您的代码malloc的空间足以容纳空终止符。您需要更改逻辑以提供更多空间。
  • malloc的所有内容必须为free d。

答案 1 :(得分:1)

你的malloc只有1个字节,但你可能会将很多字符放入* s和* p。在将每个字符放入数组之前,您至少需要存储每个字符的存储空间。

答案 2 :(得分:0)

你的意思是这个吗?我认为你的例子中有一些缺失的引用。

char *strcat (char *dest, const char *src)
{
char *dp;
char *sp = (char *)src;

if ((dest != NULL) && (src != NULL))
{
    dp = &dest[strlen(dest)];

    while (*sp != '\0')
    {
        *dp++ = *sp++;
    }
    *dp = '\0';
}
return dest;
}

答案 3 :(得分:0)

正确的代码:

char *ss=s;
while(*ss!='\0')
{
    sizeOfs++; ss++;
}
char *pp=p;
while(*pp!='\0')
{
    sizeOfp++; pp++;
}

你基本上有一个无限循环。我也会malloc更大的尺寸,以免造成任何内存溢出。

答案 4 :(得分:0)

Jeniffer,我必须承认,这看起来非常相似to the code I mentioned to you before

但是你缺少一些关键要素。

首先,当我做最初的malloc()时:

char * str1 = malloc(6); // give string 1 some memory

我这样做了,因为我将要放入字符串(在该示例中为“hello”)已经足够了。您正试图动态获取字符串,直到看到'\n'。因此,如果你想使用这种方法,你将不得不分配“足够大”的东西。

char *s = (char*) malloc (1);

这不能“足够大”,因为字符串必须至少有一个字符和'\0'的空间,否则它不是字符串,只是一个字符。 :)

你真的无法确定“足够大”是什么,所以如果字符串大小上没有上限,那么只要抓住一些内存并获得更多,如果你接近过度流动它:

char *s = (char*) malloc (50); //That's better, room for some char's

你错过的第二点,在mystrcat()函数中,看到我放在那里的行:

// We need more memory for s, it was only made to hold its own string so :
s = realloc(s, length of s + length of p + 1);  // +1 for NULL terminator

你可以read up on realloc()但基本上它可以给你更多的记忆。当你连接你的字符串时,你可能需要获得更多的内存。这是计算ap的大小的重点。


第三点,我给你的伪代码是:

while(s's character is not '\0')

你正在做什么是行不通的。您需要检查字符串中的字符'\0',如:

while(s[counter] != '\0')

并在你去的时候递增计数器。