string :: length()返回垃圾值

时间:2017-05-19 07:56:41

标签: c++ string algorithm string-length

我正在尝试在我编写的函数string::length()中使用match(),但我得到的是垃圾值。

为什么标记的行输出垃圾值?

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;

void match(string st1,string st2)
{
    for(int i=0;i<st1.length();i++)
    {
        cout<<"Why this value is garbage "<<(i-st1.length()-1)<<"\t";
        // this expression gives wrong values ^^^^^^^^^^^^^^^
    }
}

int main()
{
    string st1,st2;
    cout<<"Enter the required string\n";
    cin>>st1>>st2;
    match(st1,st2);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

想象一个字符串“foo”:

i-st1.length()-1表示:

当我为0时:

0 - 3 = -3
  - 1 = -4

但是st1.length()size_t,它是无符号的,因此表达式中的所有术语都会提升为无符号值。

(unsigned)0 - (unsigned)3 = 0xfffffffffffffffd
                      - 1 = 0xfffffffffffffffc

                          = 18446744073709551612

答案 1 :(得分:1)

问题是我是int值,而string::length会返回size_t值。第一个是带符号的值,而第二个是无符号的。防止这种情况的一种方法是将st1.length()强制转换为int,因此操作中的所有元素都是有符号值。然后,您将获得您正在寻找的价值。

i-(int)st1.length()-1

答案 2 :(得分:1)

这不是垃圾,您隐式转换/推广signed类型(isigned int)为“无符号”类型(length()的返回类型size_tunsigned

这是隐式发生的,因为unsigned type signed one更强大。这是C / C ++世界中常见的错误来源。

这是您需要修改的内容:

cout<<" **NOT** garbage "<<(i-(int)st1.length()-1)<<"\t"<<endl;

快乐的节目!