我试图用c++编写类似于strcat()的函数。
这是此函数的代码:
char *mystrcat(char *str1, char *str2){
int i = 0;
char *buffer = str1;
while(*str1){
str1++; i++;
}
i++;
while(*str2){
str1[i] = *str2;
str2++; i++;
}
str1[++i] = '\0';
str1 = buffer;
return str1;
}
此函数的输入值由以下代码给出:char string1[100], string2[100];
cout << "Enter string 1 ";
cin >> string1;
cout << "Enter string 2 ";
cin >> string2;
mystrcat(string1, string2);
cout << string1 << endl;
当我运行代码并尝试输入两个字符串时,它给出了以下输出:Enter string 1 qwerty
Enter string 2 asdf
qwerty
为什么只显示第一个字符串?
最佳答案
首先,由于您在第一个循环中同时增加了str1
和i
,因此在该数组中的移动速度将是您认为的两倍。那是因为您同时增加了两者:
您实际上很幸运地选择了偶数个字符,否则您可能会继续超出
str1
的结尾(通过丢失\0
),从而带来各种乐趣和欢乐:-)您应该增加一个或另一个,例如:
char *mystrcat(char *str1, char *str2) {
int i = 0;
while(str1[i] != '\0')
i++;
while(*str2 != '\0')
str1[i++] = *str2++;
str1[i] = '\0';
return str1;
}
之所以只在串联后得到第一个字符串,是因为第一个循环之后是
i++
(我已从上面的代码中删除了它)。当您退出该循环时,
i
是str1
终止符的索引,因此,此时的i++
将跳过它。这意味着您将在该终止符之后附加str2
:qwerty<nul>asdf<nul>
因此,该字符串将仅是qwerty
,因为C字符串始终在第一个终止符处停止。我经常发现能够从内存映射和变量寄存器(在纸上)开始,然后在脑海中运行代码,并一路更改变量是很有用的。它有助于了解您的程序如何工作。您可以从以下内容开始:
1 2
Index: 012345678901234567890
str1: qwerty_
str2: asdf_
i: 0
然后,您脑海中的每一行代码都将导致i
更改,或字符串存储块发生更改(末尾的_
表示字符串终止符)。
关于c++ - 函数类似于strcat()的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62827030/