华为机试题库第1题:字符串最后一个单词的长度

一、题目:

二、思路

从后往前用一个循环查找空格,查到了就把最后那个单词的长度输出

三、个人错误代码

#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;
}

最后结果:

错误点:

(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) 作为兼容性宏替换。

(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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值