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
类型(i
是 signed int
)到一个 'unsigned' 类型(return length()
的类型是 size_t
即 unsigned
).
它是隐式发生的,因为 unsigned type
比 signed one
更强大 。这是 C/C++ 世界中常见的错误来源。
这是您需要修改的内容:
cout<<" **NOT** garbage "<<(i-(int)st1.length()-1)<<"\t"<<endl;
编程愉快!
我正在尝试在我编写的名为 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
类型(i
是 signed int
)到一个 'unsigned' 类型(return length()
的类型是 size_t
即 unsigned
).
它是隐式发生的,因为 unsigned type
比 signed one
更强大 。这是 C/C++ 世界中常见的错误来源。
这是您需要修改的内容:
cout<<" **NOT** garbage "<<(i-(int)st1.length()-1)<<"\t"<<endl;
编程愉快!