我正在尝试执行一项小任务,要求将数字转换为电话键盘的字母,例如,如果输入为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.
答案 0 :(得分:2)
在此if
声明中:
if(text[i] != text[j] || j == text.size())
第二个条件(j == text.size()
)将永远不会成立,因为循环将在此之前终止。因此,当您到达字符串的末尾时,result
和i
的值将无法正确更新。
你可以做的是从循环中删除终止条件(没有必要有一个,因为你无论如何都会打破循环)。你需要颠倒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;
}