簡體   English   中英

C ++匹配特定字符串

[英]C++ matching a specific string

我這里有一個函數,用於檢查文本文件中是否存在字符串。 我現在遇到的問題是它正在檢查子字符串,因此,如果文件中包含單詞“ IronMan”,則該字符串的任何部分都將通過檢查。

這是該函數的代碼:

void UIFunctions::checkIfExists()
{
    while (!fin.eof())
    {
        getline(fin, line);
        if (line.compare(getFriendName()) == string::npos)
        {
            setExists(false);
            cout << getExistsErrorPrompt() << endl << endl;
            if (listAfterCheck == 1)
            {
                listUsers();
            }
            cout << endl;
            cout << endl;
            cout << getErrorPrompt();
        }
    }
}

我搜索了解決方案並閱讀了這一行。 比較 (從線改變。 找到 )就是我需要匹配整個字符串,但而不是接受字符串(如line.find所做的那樣),現在它不接受任何東西,以通過檢查。

編輯:此功能使用的文件也將如下所示:

Ironman Captain Thor

問題是您假設compare返回的值與find相同。 compare函數返回一個帶值的整數:

  • 如果字符串相等,則為0
  • >0如果所比較的字符串(在你的情況line )按字典順序第一
  • 如果比較字符串(在您的情況下為getFriendName() )在字典上排在第一位,則<0

因此,要檢查是否完全匹配,您需要:

if(line.compare(getFriendName()) == 0) {
    setExists(false);
    // ...
}

將比較結果與string::npos compare將永遠不會觸發,因為compare的大小是兩個字符串之間的第一個不同字符。

std::basic_string::compare返回小於0、0或大於0的值。

if (line.compare(getFriendName()) == string::npos)

正在查看返回的值是否為string::npos類型的string::npos您很有可能永遠不會觸發if語句。 如果您只想完全匹配一個字符串,則可以使用

if (line == getFriendName())

相反,如果您要查找以getFriendName()開頭的任何行,則需要

if (line.find(getFriendName()) == 0) 

在上面的代碼中,如果字符串以您想要的開頭,則find僅返回0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM