请问这哪里错了5255 一直找不到错误

#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');
	while((*p1++=*p2++)!='\0') ; 
	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;
}


慕斯7376262
浏览 871回答 2
2回答

onemoo

虽然你没有说明遇到了什么样的问题。但这个代码看起来没有重大的影响编译的错误,所以应该是能够编译的。我猜,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>

lookx

因为第一个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;}
打开App,查看更多内容
随时随地看视频慕课网APP