我正在尝试学习一些这种美丽的语言,但我一直坚持这一点。问题是:为什么最后一次统计仅显示Witaj PJC
而不显示Witaj Cpp PJC
?如您所见,功能应用程序必须将已转换的第二个单词添加到第一个单词。
谢谢你的帮助。
如果你能给我任何关于指针的好教程,我会很感激。谢谢!
#include <iostream>
#include <string.h>
using namespace std;
void app(char *str2, char *str1){
for(int i =0; i < strlen(str2); i++){
*(str2++);
}
for(int i =0; i < strlen(str1); i++){
*(str1++);
}
for(int i =0; i < strlen(str1); i++){
*(str2)=*(str1);
*(str2)++;
*(str1)--;
}
}
int main()
{
char *str1 = "ppC ";
char str2[20] = "Witaj";
cout << str2 << endl; // Witaj
app(str2, str1);
cout << str2 << endl; // Witaj Cpp shows WitCpp
app(str2, "CJP ");
cout << str2 << endl; // Witaj Cpp PJC shows WitPJ
return 0;
}
答案 0 :(得分:4)
你的问题就是这种循环:
for(int i =0; i < strlen(str2); i++){
*(str2++);
}
您无法使用str2++
移动指针,并期望strlen(str2)
仍然返回原始指针的长度。
对于循环变量,在每次迭代中:
i str2 strlen(str2) condition
Iteration 1 0 Witaj 5 0 < 5 Ok
Iteration 2 1 itaj 4 1 < 4 Ok
Iteration 3 2 taj 3 2 < 3 Ok
Iteration 4 3 aj 2 3 < 2 Exit at 3rd character!!
因此......你只是&#34;移动&#34;你的指针3个字节。
更改该应用功能:
void app(char *str2, char *str1){
int nstr2 = strlen(str2);
int nstr1 = strlen(str1);
for(int i =0; i < nstr2; i++){
*(str2++);
}
for(int i =0; i < nstr1; i++){
*(str1++);
}
for(int i =0; i < nstr1; i++){
*(str2++)=*(--str1);
}
}
无论如何......这个程序仅适用于学术人员,或者您正在考虑专业地使用它?
答案 1 :(得分:0)
对于一些只是字符串追加的功能代码,我潦草地写了这个......
请注意,您应该进行const调用,如果要反转其中一个字符串(从您的问题中有点不清楚),则应在追加之前完成。
使用新分配的字符串追加(相当不安全和基本)的示例:
char* app(char *str2, char *str1){
char* appendedstring = (char*)malloc(sizeof(char)*20);
char *temp = str1;
char *temp2 = str2;
int stringlen1 = strlen(str1);
int stringlen2 = strlen(str2);
//Copy string 1
for (int i = 0; i < stringlen2; i++){
appendedstring[i] = *temp2;
temp2++;
}
//Append string 2
for (int i = 0; i < stringlen1 + 1; i++){
appendedstring[stringlen2 + i] = *temp;
temp++;
}
return appendedstring;
}
int main()
{
int t;
char *str1 = "ppC ";
char str2[20] = "Witaj";
cout << str1 << endl;
cout << str2 << endl; // Witaj
char* newstr = app(str2, str1);
cout << newstr << endl; // Witaj Cpp shows WitCpp
char* newstr2 = app(str2, "CJP ");
cout << newstr2 << endl; // Witaj Cpp PJC shows WitPJ
return 0;
}