将两个指针字符串连接在一起的函数

Jac*_*haw 0 c pointers

我在将这两个指针串连接在一起时遇到问题,下面是我的连接函数,我应该将字符串1添加到字符串2.此外,我不能在字符串库中使用任何函数,这就是这是为了通过自己编写代码来帮助我们理解函数中的代码.

char strconcat(char *user2p, char *user1p) {
    while (*user2p) {
        user2p++;
    }
    while (*user1p) {
        *user2p = *user1p;
        *user2p++;
        *user1p++;
    }
    *user2p = '\0';

    printf("test: %c", *user2p);

    return *user2p;
}
Run Code Online (Sandbox Code Playgroud)

这是我的主要部分与功能相关.

int main() {
    char userString1[21], userString2[21];
    char *user1p, *user2p;

    user1p = userString1;
    user2p = userString2;

    printf("Please enter the first string: ");
    gets(userString1);

    printf("Please enter the second string: ");
    gets(userString2);

    printf("String 1 after concatenation: ");
    puts(userString1);
    printf("String 2 after concatenation: %c\n", strconcat(user2p, user1p));
Run Code Online (Sandbox Code Playgroud)

终端一直给我这个,我没有包括长度和字母顺序的代码.当我尝试printf在函数中运行测试时它给了我一个null,当我返回函数时它没有给我任何东西.我很茫然,非常感谢任何帮助!

 Please enter the first string: jackhammer
 Please enter the second string: jacky
 The length of string 1 is: 10
 The length of string 2 is: 5
 String 1 comes before string 2 alphabetically.
 String 1 after concatenation: jackhammer
 (null)
 String 2 after concatenation:
Run Code Online (Sandbox Code Playgroud)

Cra*_*tey 5

你CONCAT算法是好的,但你必须返回一个指针原来的 [左边]值,所以你的功能需要循环之前将其保存:

char *
strconcat(char *user2p, char *user1p)
{
    char *orig2p = user2p;

    while (*user2p) {
        user2p++;
    }
    while (*user1p) {
        *user2p = *user1p;
        user2p++;
        user1p++;
    }
    *user2p = '\0';

    printf("test: %s\n", orig2p);

    return orig2p;
}
Run Code Online (Sandbox Code Playgroud)

更新:

为了给concat函数提供一个完全无懈可击的测试程序,我们可以使用[overly]大输入缓冲区并将输入长度限制为最大目标缓冲区的1/2.

gets 去掉换行,但是fgets确实没有.所以,我创建了一个xgets类似于gets但使用fgetsstrchr获得[几乎]相同效果的函数.

虽然我认为使用标准字符串函数作为测试代码的一部分是可以的,但我已经创建了一个手写代码版本strchr[希望这不是你的下一个任务:-)].

无论如何,这是完整的程序:

#include <stdio.h>

char *
strconcat(char *user2p, char *user1p)
{
    char *orig2p = user2p;

    while (*user2p) {
        user2p++;
    }
    while (*user1p) {
        *user2p = *user1p;
        *user2p++;
        *user1p++;
    }
    *user2p = '\0';

    printf("test: %s\n", orig2p);

    return orig2p;
}

char *
xstrchr(char *buf,int chrwant)
{
    int chrcur;
    char *res = NULL;

    for (chrcur = *buf++;  chrcur != 0;  chrcur = *buf++) {
        if (chrcur == chrwant) {
            res = buf - 1;
            break;
        }
    }

    return res;
}

char *
xgets(char *buf,int maxlen)
{
    char *cp;
    char *res;

    res = fgets(buf,maxlen,stdin);

    if (res != NULL) {
        cp = xstrchr(buf,'\n');
        if (cp != NULL)
            *cp = 0;
    }

    return res;
}

#define MAXLEN      800

int
main(void)
{
    char userString1[MAXLEN], userString2[MAXLEN + 1];
    char *user1p, *user2p;

    printf("Please enter the first string: ");
    user1p = xgets(userString1,MAXLEN / 2);

    printf("Please enter the second string: ");
    user2p = xgets(userString2,MAXLEN / 2);

    if ((user2p != NULL) && (user1p != NULL))
        printf("String 2 after concatenation: %s\n",strconcat(user2p, user1p));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)