C:String Concatentation:Null Terminated Strings

以下代码仅连接第一个字符串并忽略第二个..从我收集的内容中,它与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); } 

您使用i索引ptr2[i] ,其范围从len1len1 + len2 。 此值可能超出string2数组的范围(除非您键入的第一个字符串恰好为空)。

我可能会写下你的第二个循环如下:

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

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

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

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

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

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

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

从我收集的内容来看,它与Null终止的字符串有关。

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