一、题目:
![](https://img-blog.csdnimg.cn/img_convert/51a1cea3694861d09c169e13c57d4c6f.png)
二、思路
从后往前用一个循环查找空格,查到了就把最后那个单词的长度输出
三、个人错误代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
char str[5000];
int length;
int i;
str[5000]=getchar();//有错
for(i=length-1;i<=0;i--)
{if (str[i]=' ')//有错
break;
}
int size=length-i-1
;
cout<<size<<endl;
return 0;
}
最后结果:
![](https://img-blog.csdnimg.cn/img_convert/d2454386d7cf5ded7afe8242ac225415.png)
错误点:
(1)本例不能使用cin来输入字符串,因为带有空格的字符串,没有办法用cin进行输入。cin只能读取空格前面的字符串,遇到空格便会停止。把空格之后的留在输入队列中(不是存储字符串的数组),而这个空格后的后半截,会在第二次调用cin的时候被错误的输入,即第二次调用cin的时候,还没输入想要输入的内容,输入就已经结束了,输入的是前一次调用cin的时候空格后的半截。
(2)std::gets 于 C++11 被弃用,并于 C++14 移除。可使用 std::fgets 替代。也就是说现在只要用C++11及以后版本的标准,gets函数都不能再用了。不过,我们可以使用#define gets(S) fgets(S,sizeof(S),stdin) 作为兼容性宏替换。
![](https://img-blog.csdnimg.cn/img_convert/0372ac024de95daeb5d9b9817f594389.png)
(3)还有一种方法可以用来输入一行带空格的字符串,即cin.getline()以及cin.get()函数。
cin.getline丢弃换行符,换成空字符(不是空格!是NULL或\0)。
cin.getline()函数有两个参数。如cin.getline(name,20); 第一个参数时用来储存输入行的数组名,第二个是要读取的字符数,若为20,则函数最多可以读取19个,余下的用来存储结尾处的空字符。
cin.get()函数的参数也是一样的。但是不同于cin.getline,cin.get会把换行符留在输入队列中(不是存储输入行的数组),因此下一次调用的时候会看到输入队列第一个字符就是换行符,函数认为以及达到行尾,直接不输入了。
为了解决上述问题,可以使用cin.get()不带任何参数,表示调用可读取的下一个字符(即使是换行符)。因此,在两个带参数的cin.get()函数中间插入一个没有参数的cin.get()函数语句,是很好的解决方法,第二个cin.get()将不会读入那个留在输入队列中的换行符。
(4)getchar从标准输入 stdin 获取一个字符(一个无符号字符),而不是字符串。
用法:char c;c = getchar();
(5)if后面的逻辑语句要用==而不是单个=。
(6)strlen可以返回长度。上述代码没有求出length就使用length了。
(7)getline(cin,str)和cin.getline(str,num)差不多,但getline属于string流,cin.getline属于istream流。getline不能对char字符串使用,只能对string。
四、改正后的正确代码
(1)使用宏定义gets()的方法
//输入时敲的回车,换行符也会被算进去。此处代码是假定有别的方法结束输入,不用算换行符
#include <iostream>
#include <string>
#define gets(S) fgets(S,sizeof(S),stdin)
using namespace std;
int main()
{
char str[5000] = { 0 };
int length;
int i;
gets(str);
length = strlen(str);
for (i = length - 1; i >= 0; i--)
{
if (str[i] == ' ')
break;
}
int size = length - i - 1;//如果只能敲回车结束输入,换行符也被算进去,那只能减2了
cout << size << endl;
return 0;
}
(2)使用cin.getline()的方法
#include <iostream>
#include <string>
using namespace std;
int main()
{
char str[5000] = { 0 };
int length;
int i;
cin.getline(str, 5001);
length = strlen(str);
for (i = length - 1; i >= 0; i--)
{
if (str[i] == ' ')
break;
}
int size = length - i - 1
;
cout << size << endl;
return 0;
}
(3)使用getline(),必须用string,而非char
#include <iostream>
#include <string>
using namespace std;
int test;
int main()
{
string str;
int length;
int i;
getline(cin, str);
length = str.length();//求string型的长度
for (i = length - 1; i >= 0; i--)
{
if (str[i] == ' ')
break;
}
int size = length - i - 1;
cout << size << endl;
return 0;
}