2 回答

TA贡献883条经验 获得超454个赞
虽然你没有说明遇到了什么样的问题。但这个代码看起来没有重大的影响编译的错误,所以应该是能够编译的。
我猜,str_cat 函数的结果看起来并没有把两个字符串拼接上,是吗?
第 9 行的 while,我知道你是为了找到 p1 所指字符串结尾的 '\0'。但是当 p1++ 表达式指向 '\0' 时,while 会退出循环,可别忘了 p1 还会自增,所以 p1 最后会指向 '\0' 的后一位。
于是最终拼接好的字符串中,在 s1 和 s2 之间仍夹着 s1 原来结尾的 '\0'。
由于 C++ 中规定字符串以 '\0' 结尾,所以 cout 只会打印出"l am a chinese"
还有一些细节上的问题:
第16行 *s2="l love China"。等号右侧是字符串字面量,C++ 视其为字符串常量,C++ 标准不允许将字符串常量赋值给普通字符指针。 似乎大多数编译器对此只是给出警告,如果你的编译器严格到在这里报错的话……那这里就也算错误。 不过确实应该避免这样的用法。
第 2 行,C++ 代码中应该用 C++ 风格的头文件<cassert>

TA贡献1条经验 获得超0个赞
因为第一个white中 p1跳出来后*p1=='\0';将代码改成如下即可
#include<iostream>
#include<assert.h>
using namespace std;
int str_len(char*p);
char *str_cat(char*p1, char*p2)
{
assert(*p1!='\0'&&*p2!='\0');
char *address = p1;
while(*p1!='\0')
{p1++;
};
*p1++=' ';
while((*p1=*p2)!='\0')
{p1++;p2++;
} ;
return address;
}
int main()
{
int flag;
char s1[40]="l am a chinese",*s2="l love China";
flag=str_len(s1)-str_len(s2);
if(flag>0) cout<<(str_cat(s1,s2));
else cout<<str_cat(s2,s1);
}
int str_len(char*p)
{
int n=0;
assert(*p!='\0');
while(*p!='\0')
{
if('a'<=*p&&*p<='z'||'A'<=*p&&*p<='Z') n++;
p++;
}
return n;
}
- 2 回答
- 0 关注
- 870 浏览
添加回答
举报