文章目录

    • 重要的事说三遍
      • C++中string类size() length()函数的返回值是无符号数
      • C++中string类size() length()函数的返回值是无符号数
      • C++中string类size() length()函数的返回值是无符号数
    • 起因
    • 思考
    • 解决

 

重要的事说三遍

C++中string类size() length()函数的返回值是无符号数

C++中string类size() length()函数的返回值是无符号数

C++中string类size() length()函数的返回值是无符号数

起因

今天涛哥做了一道LeetCode,问了我一下,这一下子差点给我整不会了,整理此文留作纪念,也希望看到的小伙伴们记住这个知识点!

题目是这样的
C++中string类 size() length()函数的返回值问题_无符号数

我写的是这样的代码

class Solution {
public:
    string truncateSentence(string s, int k) {
        int end=-1;

        while(k&&end<s.length())
        {
            if(s[++end] == ' ')
                k--;
        }
        return s.substr(0,end);
    }
};

可是怎么样也进不去while循环
C++中string类 size() length()函数的返回值问题_string类_02

思考

这可不行啊,有问题得想办法解决啊!

我一想应该是s.length()出的问题,查了很多资料,突然发现 string类的size() length()函数返回的是 无符号数,我觉得肯定是 无符号数和有符号数相比出的问题。

忽然想起了之前整理的一篇各类数值型数据间的混合运算的博文,发现关于无符号与有符号数运算没有太细讲,但是也多少提到了。

从我的上面这篇博文中找出了这张图
C++中string类 size() length()函数的返回值问题_算法_03

我们可以看到,无符号和有符号两个数比较时,会默认转成无符号数,再进行比较。

但是负数的话转成无符号数的话就会非常大,所以就出现了问题

关于有符号数转成无符号数的转化过程,内容过多,我整理到了另一篇博文,有兴趣的小伙伴可以看一下,链接如下:javascript:void(0)

解决

给s.length()强转一下就行了(记住这个知识点!)。

class Solution {
public:
    string truncateSentence(string s, int k) {
        int end=-1;

        while(k&&end<(int)s.length())
        {
            if(s[++end] == ' ')
                k--;
        }
        return s.substr(0,end);
    }
};