C++ 解析輸入

2023-03-20 16:51 更新

在1.4節(jié),我們把“解析”定義為分析自然語言句子或形式語言語句之結(jié)構(gòu)的過程。比如,編譯器在將代碼翻譯成機器語言程序之前必須先進行解析。

此外,當(dāng)你從文件或鍵盤讀取輸入時,一般也需要進行解析,以提取想要的信息并發(fā)現(xiàn)錯誤。

例如,我有一個文件distances,其中包含了美國主要城市之間的距離信息。這些信息是我從一個隨機選擇的網(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

文件中的每一行包含了兩個城市的名字以及它們之間的距離,其中城市名用引號標(biāo)記,距離以英里為單位。引號是有用的,因為它能讓我們很容易地處理多于一個單詞的城市名,如”San Francisco“(舊金山)。

通過搜索一行輸入中的引號,我們能找到每個城市在該行的開始和結(jié)束位置。不過查找引號這樣的特殊字符可能讓人有點困惑,因為引號是C++中用于標(biāo)識字符串的特殊字符。

要找到引號第一次出現(xiàn)的位置,應(yīng)該這樣寫:

int index = line.find (’\"’);

參數(shù)看起來有點亂,不過它就是表示雙引號字符。最外層的單引號依然用于表示這是個字符值。反斜杠(\)說明我們想使用下一個字符的字面意義。 所以序列 \" 表示雙引號,而序列 \’表示單引號。有趣的是, 序列\(zhòng)表示一個反斜杠。第一個反斜杠指示我們要認(rèn)真對待第二個反斜杠。

解析輸入行由這幾部分組成:找到每個城市名在該行中的開始和結(jié)束位置,使用substr函數(shù)提取城市和距離信息。substr是apstring的成員函數(shù)之一,它有兩個參數(shù),分別是子串的起始位置和長度。

void processLine (const apstring& line)
{
  // 我們要查找的字符是引號
  char quote = ’\"’;

  // 將引號的索引保存在一個向量中
  apvector<int> quoteIndex (4);

  // 使用內(nèi)置的find函數(shù)查找到第一個引號
  quoteIndex[0] = line.find (quote);

  // 使用第7章定義的find函數(shù)查找其他引號
  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)然,我們真正想要的并不僅僅是提取并顯示信息,不過這是一個好的開始。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號