我正在尝试在我编写的函数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;
}
答案 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
类型(i
为signed int
)为“无符号”类型(length()
的返回类型size_t
是unsigned
。
这是隐式发生的,因为unsigned type
比signed one
更强大。这是C / C ++世界中常见的错误来源。
这是您需要修改的内容:
cout<<" **NOT** garbage "<<(i-(int)st1.length()-1)<<"\t"<<endl;
快乐的节目!