string::length() 返回垃圾值

string::length() returning garbage value

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

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

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

想象一个字符串 "foo":

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

当我为 0 时:

0 - 3 = -3
  - 1 = -4

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

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

                          = 18446744073709551612

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

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

这不是垃圾,你隐含地 converting/promoting 一个 signed 类型(isigned int)到一个 'unsigned' 类型(return length() 的类型是 size_tunsigned).

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

这是您需要修改的内容:

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

编程愉快!