我有下面的代碼不起作用:字符串::找到返回值爲-1時,它的預期返回值0 [C++]
string line;
string line_sub;
size_t open_tag_start;
const string open_tag = "<image>";
const int open_len = open_tag.length() + 1;
open_tag_start = line.find(open_tag);
line_sub = line.substr(open_tag_start, open_len);
當我嘗試運行此代碼,我得到以下錯誤:
terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr Aborted (core dumped)
我已經想通了,這個錯誤發生,因爲line.find
線的-1
值返回變量open_tag_start
。我可以通過將0
的值硬編碼到變量open_tag_start
來糾正問題,但我需要這種通用算法,以便能夠在行中的任意點找到標記,因此它必須是變量。任何人都可以看到我在這裏做錯了嗎?
這裏有一些更多的信息。
我這段代碼的目標,如果從string line
提取string line_sub
,其中確實包含一個字符串,而當我設size_t open_tag_start = 0
,我能夠編譯和執行代碼,並觀察預期的輸出。 line
不是空的,我的問題是,當我更換
line_sub = line.substr(open_tag_start, open_len);
與
line_sub = line.substr(0, open_len);
我的問題解決了,我可以編譯和執行代碼。
這是我的程序的簡短版本,其中只包含導致問題的部分。試圖編譯這段代碼將產生上面詳述的錯誤信息。該文件rss.xml
是engadget.com http://www.engadget.com/rss.xml
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <cstring>
using namespace std;
void get_tag_contents(ifstream& rssfile, string line, string open_tag);
int main()
{
const string open_tag = "<image>";
ifstream rssfile;
rssfile.open("rss.xml");
string line;
getline(rssfile, line, '\n');
get_tag_contents(rssfile, line, open_tag);
return 0;
}
void get_tag_contents(ifstream& rssfile, string line, string open_tag)
{
const int open_len = open_tag.length() + 1;
size_t open_tag_start;
string line_sub;
open_tag_start = line.find(open_tag);
line_sub = line.substr(open_tag_start, open_len);
}
請發佈一個簡短的,自包含的程序來編譯和演示問題。在你省略的任何代碼中都有一個重要的細節。 – 2010-11-21 19:38:19
我用代碼更新了我的問題。 – 2010-11-21 19:57:03