2017-05-19 38 views
-2

我想在我寫的函數裏面使用string::length(),名字爲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; 
} 
+1

請問您可以添加您獲得的輸出嗎? –

+1

你是什麼意思_「垃圾」_?你從'我'減去長度,並想知道爲什麼你會得到一個負值:'i-st1.length() - 1'? –

+0

您的文章標題具有誤導性。 length()工作正常,你的表達式(i-st1.length() - 1)是錯誤的。 – eddie

回答

4

想象一個字符串 「foo」:

i-st1.length()-1指:

當i爲0:

0 - 3 = -3 
    - 1 = -4 

st1.length()size_t,其是無符號的,因此所有術語在表達式中被提升爲無符號值。

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

          = 18446744073709551612 
1

的問題是,我是一個int價值,同時string::length將返回一個size_t值。第一個是有符號值,第二個是無符號。防止這種情況的一種方法是將st1.length()作爲int進行強制轉換,以便操作中的所有元素都是帶符號的值。您將獲得您正在尋找的價值。

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

這不是垃圾,則隱式轉換/促進signed類型(isigned int)到一個「無符號」一(返回的length()類型是size_t,其是unsigned)。

它隱含發生,因爲unsigned type更強大signed one。這是C/C++世界中常見的錯誤來源。

這是需要修改的內容:

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

快樂編程!