错解:
#include<iostream>
#include<cstring>
using namespace std;
void longest(char c1[100],char c2[100]){
char word_now[100];
char *p2=word_now;
int max_len=0;
int i,j;
int n=0;
for(i=0;c1[i]!=0;i++){
if(c1[i]!=' '){
n++;
*p2++=c1[i];
}
else{
if(max_len<n){
max_len=n;
strcpy(c2,word_now);
n=0;
*p2='\0';
p2=word_now;
}
}
}
}
int main(){
char c1[1000];
char c2[100];
cin.getline(c1,1000);
longest(c1,c2);
cout<<c2<<endl;
return 0;
}
-
对字符串的处理,一定要记得在末尾加上‘ \0’然后输出
-
这里如果最后一个单词是最长单词,但是由于最后一个单词末尾不是空格,所以不会输出,指针指到字符串的最后一个单词后,直接跳出for循环,而没有记录最后一个单词的长度,需要在for循环外再次比较
正解:
#include<iostream> #include<cstring> using namespace std; void longest(char c1[100],char c2[100]){ char word_now[100]; char *p2=word_now; int max_len=0; int i,j; int n=0; for(i=0;c1[i]!=0;i++){ if(c1[i]!=' '){ n++; *p2++=c1[i]; } else{ if(max_len<n){ max_len=n; *p2='\0'; strcpy(c2,word_now); n=0; p2=word_now; } } } if(max_len<n){ max_len=n; *p2='\0'; strcpy(c2,word_now); } } int main(){ char c1[1000]; char c2[100]; cin.getline(c1,1000); longest(c1,c2); cout<<c2<<endl; return 0; }
-
单词构建逻辑:当遇到非空格字符时,正确地增加了单词长度计数器
n
并将字符追加到word_now
,同时移动p2
指针以指向下一个字符位置。 -
单词结束逻辑:当遇到空格时(表示当前单词结束),检查当前单词长度
n
是否大于之前记录的最长单词长度max_len
。如果是,更新最长单词长度并将当前单词复制到c2
。之后,无论是否更新了最长单词,都重置n
和将p2
指针重置回word_now
的开始,为下一个单词的构建做准备。 -
字符串末尾的单词处理:在循环结束后,检查最后一个单词(如果字符串以单词结尾而非空格)。如果这个单词是最长的,同样更新
c2
。这确保了即使输入字符串没有以空格结尾,最后一个单词也会被正确处理。
-