2013-04-20 24 views
0
do { 
    getline (myfile,temp); 
    if (temp[0] != "="){ 
     MyAlbums[i].tracks.push_back(temp); 

    } 
    else { 
     break; 
    } 
}while(true); 

之間的比較給了我這個錯誤:C++變通指針和整數

ISO C++禁止指針和整數[-fpermissive]

我公司通過在一個文本文件中的行試圖環路之間的比較和'push_pack',如果該行不是以「=」等號字符開頭的話。否則我想擺脫循環。

任何幫助非常appriceated!

回答

6
if (temp[0] != "="){ 

應該

if (temp[0] != '='){ 

的原因是,temp[0]char型的(假設temp是你讀的字符串),你應該使用char文字'='不是字符串文字"="進行比較。我假設你成功閱讀temp,所以你可能需要檢查,如果情況並非如此。

EDIT(感謝亞當利斯)

字符串文字等"="是(const char *)型,它們被封閉在雙引號;個別字符用單引號括起來。因此,你有編譯的抱怨信息,關於比較char(char literal是整數)和const char *

從這裏報價:IBM C++ documentation

C A character literal has type int. 
C++ A character literal that contains only one character has type char, 
which is an integral type. 
+0

澄清(作爲tacp繼續編輯他的答案):字符串(這是指向字符的指針)用雙引號括起來;個別字符用單引號括起來。因此錯誤消息抱怨指針。 – 2013-04-20 01:31:30

+0

@AdamLiss謝謝。這使事情變得更好,更清晰。 – taocp 2013-04-20 01:31:59

+0

感謝您提供一個乾淨,直接的答案。這非常有幫助 – user1082764 2013-04-20 01:33:16

1

首先,確保getline成功。評價它在bool EAN上下文找出答案:

while (getline(myfile, temp)) { 
    /* code goes here */ 
} 

,而不是

do { 
    getline(myfile, temp); 
    /* code goes here */ 
} while (true); 

永遠不要做輸入而不檢查,如果它立即失敗,或者你會得到非常惱人的bug追蹤。

其次,確保temp至少有一個字符長。如果可以安全地使用temp[0],則temp.size() >= 1將是true。如果getline曾經爲您提供長度爲0的string,則對其執行temp[0]將導致未定義的行爲。未定義的行爲真的很煩人,因爲它在一種情況下可能表現完全無害,然後在意外的地方咬你。

三,做temp[0] != '='而不是temp[0] != "="'='是一個字符,"="是2個字符的緩衝區,第一個是'=',第二個是'\0'。當您嘗試執行!=時,由"="表示的兩個字符(由"="表示)的數組隱式轉換爲指向第一個字符的指針,然後生成一個錯誤(因爲它不知道如何將指向字符的指針與字符進行比較)。