C语言 如何添加两个指针?

wtzytmuj  于 2023-03-28  发布在  其他
关注(0)|答案(5)|浏览(137)

有人可以帮助我与此代码.我需要追加这两个指针在一起,但它不为我工作.代码不添加指针在一起.我认为 *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;
}
tpxzln5u

tpxzln5u1#

由于这可能是一个家庭作业,这里有一些提示:
内部mystrcat

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

外部mystrcat

  • 你的mystrcat函数假设s有足够的空间来存储s的所有字符,p的所有字符和一个null终止符。你的代码malloc有足够的空间来保存null终止符。你需要改变逻辑来提供更多的空间。
  • 所有你malloc的东西必须是free d。
2wnc66cl

2wnc66cl2#

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

bqjvbblv

bqjvbblv3#

你的意思是这个吗?我认为在你的例子中缺少了一些解引用。

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;
}
8i9zcol2

8i9zcol24#

正确代码:

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

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

yftpprvb

yftpprvb5#

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')

并不断递增计数器。

相关问题