6

たとえば、入力が222の場合、電話ボタン「2」を意味します(http://upload.wikimedia.org/wikipedia/commons/7/ 7d/Telephone-keypad.png ) を 3 回押すと、出力は "C" などになるはずです。まず、22255-444 などのすべてのシーケンスを 222 、55 、- 、444 に分割する必要があります。それから私はすべてを理解すると思いますが、今の問題は私の関数が最後のシーケンスを読み取れないことです

#include <iostream>
#include <fstream>
using namespace std;
//-------------------------------------------------------------------------

void encode(string text, string &result, int &i)
{
 char keyboard[10][4] = {
    {' ',' ',' ',' '},
    {'.','?','!','.'},
    {'a','b','c','a'},
    {'d','e','f','d'},
    {'g','h','i','g'},
    {'j','k','l','j'},
    {'m','n','o','m'},
    {'p','r','q','s'},
    {'t','u','v','t'},
    {'w','x','y','z'}
  };

  int j;
  for(j = i; j<text.size();j++)
  {
    if(text[i] != text[j] || j == text.size())
    {
        result = text.substr(i, j-i);
        i = j-1;
        break;
    }

  }
  cout << result << endl;

}



int main()
{
  ifstream fd("sms.in");
  string text;
  string result;
  getline(fd, text);
  for(int i = 0; i<text.size();i++)
  {
    encode(text, result, i);
  }
  return 0;
}

テストとして、この入力を使用しています: 5552-22-27777 、出力は 555 2 - 22 - 2 7777 である必要がありますが、私にとっては 555 2 - 22 - 2 2 2 2 2 です。

4

2 に答える 2

2

このif声明では:

if(text[i] != text[j] || j == text.size())

2 番目の条件 ( j == text.size()) は、その前にループが終了するため、真になることはありません。そのため、文字列の最後に到達すると、 と の値がresult正しくi更新されません。

できることは、ループから終了条件を削除することです (いずれにしてもループから抜け出すため、終了条件を設定する必要はありません)。ifまた、文字列の末尾を超えて読み取らないように、条件の順序を逆にする必要があります。

for(j = i; ;j++)
{
    if (j == text.size() || text[i] != text[j])
    ...
于 2012-12-12T09:24:52.243 に答える