W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在1.4節(jié),我們把“解析”定義為分析自然語言句子或形式語言語句之結(jié)構(gòu)的過程。比如,編譯器在將代碼翻譯成機(jī)器語言程序之前必須先進(jìn)行解析。
此外,當(dāng)你從文件或鍵盤讀取輸入時(shí),一般也需要進(jìn)行解析,以提取想要的信息并發(fā)現(xiàn)錯(cuò)誤。
例如,我有一個(gè)文件distances,其中包含了美國主要城市之間的距離信息。這些信息是我從一個(gè)隨機(jī)選擇的網(wǎng)頁(http://www.jaring.my/usiskl/usa/distance.html)中得到的,所以數(shù)據(jù)可能不是很準(zhǔn)確,不過這也沒什么關(guān)系。文件格式看起來是這樣的:
"Atlanta" "Chicago" 700
"Atlanta" "Boston" 1100
"Atlanta" "Chicago" 700
"Atlanta" "Dallas" 800
"Atlanta" "Denver" 1450
"Atlanta" "Detroit" 750
"Atlanta" "Orlando" 400
文件中的每一行包含了兩個(gè)城市的名字以及它們之間的距離,其中城市名用引號(hào)標(biāo)記,距離以英里為單位。引號(hào)是有用的,因?yàn)樗茏屛覀兒苋菀椎靥幚矶嘤谝粋€(gè)單詞的城市名,如”San Francisco“(舊金山)。
通過搜索一行輸入中的引號(hào),我們能找到每個(gè)城市在該行的開始和結(jié)束位置。不過查找引號(hào)這樣的特殊字符可能讓人有點(diǎn)困惑,因?yàn)橐?hào)是C++中用于標(biāo)識(shí)字符串的特殊字符。
要找到引號(hào)第一次出現(xiàn)的位置,應(yīng)該這樣寫:
int index = line.find (’\"’);
參數(shù)看起來有點(diǎn)亂,不過它就是表示雙引號(hào)字符。最外層的單引號(hào)依然用于表示這是個(gè)字符值。反斜杠(\)說明我們想使用下一個(gè)字符的字面意義。 所以序列 \" 表示雙引號(hào),而序列 \’表示單引號(hào)。有趣的是, 序列\(zhòng)表示一個(gè)反斜杠。第一個(gè)反斜杠指示我們要認(rèn)真對(duì)待第二個(gè)反斜杠。
解析輸入行由這幾部分組成:找到每個(gè)城市名在該行中的開始和結(jié)束位置,使用substr函數(shù)提取城市和距離信息。substr是apstring的成員函數(shù)之一,它有兩個(gè)參數(shù),分別是子串的起始位置和長度。
void processLine (const apstring& line)
{
// 我們要查找的字符是引號(hào)
char quote = ’\"’;
// 將引號(hào)的索引保存在一個(gè)向量中
apvector<int> quoteIndex (4);
// 使用內(nèi)置的find函數(shù)查找到第一個(gè)引號(hào)
quoteIndex[0] = line.find (quote);
// 使用第7章定義的find函數(shù)查找其他引號(hào)
for (int i=1; i<4; i++) {
quoteIndex[i] = find (line, quote, quoteIndex[i-1]+1);
}
// 將一行的內(nèi)容分割成子串
int len1 = quoteIndex[1] - quoteIndex[0] - 1;
apstring city1 = line.substr (quoteIndex[0]+1, len1);
int len2 = quoteIndex[3] - quoteIndex[2] - 1;
apstring city2 = line.substr (quoteIndex[2]+1, len2);
int len3 = line.length() - quoteIndex[2] - 1;
apstring distString = line.substr (quoteIndex[3]+1, len3);
// 輸出提取的信息
cout << city1 << "\t" << city2 << "\t" << distString << endl;
}
當(dāng)然,我們真正想要的并不僅僅是提取并顯示信息,不過這是一個(gè)好的開始。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: