【问题标题】:string::length() returning garbage value [closed]string::length() 返回垃圾值 [关闭]
【发布时间】:2017-10-19 06:12:01
【问题描述】:

我正在尝试在我编写的名为 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;
}

【问题讨论】:

  • 你能添加你得到的输出吗?
  • 你是什么意思“垃圾”?您正在从 i 中减去长度,并想知道为什么 gou 得到一个负值:i-st1.length()-1
  • 您帖子的标题具有误导性。 length() 工作正常,你的表达式 (i-st1.length()-1) 是错误的。

标签: c++ string algorithm string-length


【解决方案1】:

想象一个字符串“foo”:

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

当 i 为 0 时:

0 - 3 = -3
  - 1 = -4

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

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

                          = 18446744073709551612

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这不是垃圾,您正在隐式地将 signed 类型(isigned int)转换/提升为“无符号”类型(length() 的返回类型是 size_t,即 @987654326 @)。

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

      这是你需要修改的:

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

      编程愉快!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多