1

以下代码仅连接第一个字符串并忽略第二个字符串。从我收集的内容来看,它与 Null 终止的字符串有关。因为我是 C 新手,所以这对我来说是一个新概念。有人可以帮助使下面的代码工作吗?这对我理解这一点真的有很大帮助。

void concatTest();

int main()
{
    concatTest();

    system("PAUSE");
    return 0;
}

void concatTest()
{
    char string1[20], string2[20], string3[40];
    char *ptr1, *ptr2, *ptr3;
    ptr1 = &string1[0];
    ptr2 = &string2[0];
    ptr3 = &string3[0];
    int i;

    printf("You need to enter 2 strings.. each of which is no more than 20 chars in length: \n");

    printf("Enter string #1: \n");
    scanf("%s", string1);

    printf("Enter string #2: \n");
    scanf("%s", string2);

    int len1 = strlen(string1);
    int len2 = strlen(string2);

    for (i = 0; i < len1; i++)
    {
        ptr3[i] = ptr1[i];
    }
    for (i = len1; i < len1 + len2; i++)
    {
        ptr3[i] = ptr2[i];
    }

    printf("%s\n", string3);
}
4

3 回答 3

2

我的答案将没有代码,但希望是一个有用的解释。

C 中的每个字符串都以 . 结尾\0

如果要连接两个字符串,则需要确保用第二个字符串的一个字符覆盖第一个字符串的最后一个字符 (the \0) 。否则,无论“连接”字符串有多长,只要字符串函数遇到 a ,它就会假定已经到达字符串的末尾。\0

当然,您需要确保为关节字符串分配了足够的空间。

于 2012-07-15T23:55:45.927 回答
2

您正在ptr2[i]使用ilen1到的范围进行索引len1 + len2。该值可能会超出string2数组的范围(除非您键入的第一个字符串恰好为空)。

我可能会按如下方式编写您的第二个循环:

for (i = 0; i < len2; i++) {
    ptr3[len1 + i] = ptr2[i];
}
于 2012-07-15T23:59:30.707 回答
1

您必须从 ptr2 的第一个字符开始。

ptr3[i] = ptr2[i-len1];

据我所知,它与 Null 终止的字符串有关。

是的,它确实。字符串从偏移量 0 开始。根据第一个字符串的长度,您从某个随机点开始。

于 2012-07-16T00:05:50.417 回答