字符串中相同数字的单独序列

时间:2012-12-12 09:12:46

标签: c++ string

我正在尝试执行一项小任务,要求将数字转换为电话键盘的字母,例如,如果输入为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.

2 个答案:

答案 0 :(得分:2)

在此if声明中:

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

第二个条件(j == text.size())将永远不会成立,因为循环将在此之前终止。因此,当您到达字符串的末尾时,resulti的值将无法正确更新。

你可以做的是从循环中删除终止条件(没有必要有一个,因为你无论如何都会打破循环)。你需要颠倒if中条件的顺序,这样你就不会读到字符串的结尾:

for(j = i; ;j++)
{
    if (j == text.size() || text[i] != text[j])
    ...

答案 1 :(得分:0)

我将最后一位从for循环中拉出来,它并不真正属于那里,因为它是一个特例。我还消除了其他一些看似不必要的东西并修复了循环内部。看看这一切是否对你有意义。

我删除了keymap声明,因为它没有在你的例子中使用,我们在这里重视所谓的“最小工作示例”,作为一种分离和讨论问题的方法。

请注意,我已尝试将所有编码工作移到main()函数中的单个函数中。这释放了main来处理程序的高级部分。在我标记为“Decode here”的行上,您可以调用另一个函数,将数字字符串转换为字符,如果这就是您想要的。

我已经标记了特殊情况并明确地将其移出for循环,以便for循环中的所有内容都可以处理相同的内容。这比尝试使for-loop完成所有操作更好。

我不同意i=j-1的逻辑,所以我改变了(我做了测试)。

我还切换到直接从命令行读取输入,以便更快地进行测试。

我在开头添加了#include <string>指令,以便程序可以编译。

将所有编码工作放在一个函数中简化了函数声明到单个参数。

我切换括号以符合我对One True Style的理解。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void encode(string text) {
  int j=0,i=0; //Declare j here so we can use in special case
  for(j=0; j<text.size(); j++){
    if(text[j] != text[i]){
      cout << text.substr(i, j-i) << endl; //Decode here
      i = j;
    }
  }
  cout << text.substr(i,j-1) << endl; //Decode here. Special case
}

int main(){
  string text;

  getline(cin, text);
  encode(text, result);

  return 0;
}