Go: /*
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2006&lang=jp
Keitai Message
*/

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// 標準入力を取得するScannerのインスタンスを作成
var scanner = bufio.NewScanner(os.Stdin)

// 標準入力で各行を読み込みstringとして返す
func readLine() string {
	if scanner.Scan() {
		return scanner.Text()
	}
	return ""
}

func main() {
	// 1: . , ! ? (スペース)
	// 2: a b c
	// 3: d e f
	// 4: g h i
	// 5: j k l
	// 6: m n o
	// 7: p q r s
	// 8: t u v
	// 9: w x y z
	// 0: 確定ボタン

	// 改行から空白区切りに変更
	scanner.Split(bufio.ScanWords)
	line, _ := strconv.Atoi(readLine()) // 5行標準入力が続く

	table := []string{
		"",      // 0 index調整ためダミーデータ
		".,!? ", // 1
		"abc",   // 2
		"def",   // 3
		"ghi",   // 4
		"jkl",   // 5
		"mno",   // 6
		"pqrs",  // 7
		"tuv",   // 8
		"wxyz"}  // 9

	// 5行分の標準入力を格納するsliceを作成する
	messages := make([]string, 0, line)

	// sliceに標準入力の内容を格納する
	for i := 0; i < line; i++ {
		messages = append(messages, readLine()) // messages=[20 220 222220 44033055505550666011011111090666077705550301110 000555555550000330000444000080000200004440000]
	}

	// 各行毎に解析する
	for _, message := range messages { // message=000555555550000330000444000080000200004440000
		// 0で分割する
		messageSlice := strings.Split(message, "0") // messageSlice=[   55555555    33    444    8    2    444    ]
		for _, word := range messageSlice {
			if word == "" {
				// NOP.
				// 0をセパレーターにしているので空文字がsliceに格納されてい箇所がある
				// 何もしない
			} else { // word=55555555
				// 一文字取り出しコード値をASCII文字に変換する
				ascii := string((word[0])) // word[0]=5

				// ASCII文字からintへ変換する(tableのindexになる)
				number, _ := strconv.Atoi(ascii)

				// 入力回数をカウントする
				count := len(word) // 5

				// 同じ数字を続けて入力すると変化する文字はループすることを考慮する
				for count > len(table[number]) { // 5 > 3
					count -= len(table[number]) // 2
				}

				// キー配列
				keys := table[number]                   //jkl
				fmt.Printf("%s", string(keys[count-1])) //k
			}
		}
		fmt.Println() // 改行
	}
}

C++: #include <iostream>
#include <string>
using namespace std;

char hyo[9][5];

char moji(int char_, int count);

int main(void)
{
	int i1,i2;
	char c = 'a';
	char cc;
	string s;
	int n;
	int m;
	int count;

		/* syokika */
		for(i1=0;i1<9;i1++){	
			for(i2=0;i2<5;i2++){
				hyo[i1][i2] = '1';
			}
		}


		/* hyo sakusei */
		hyo[0][0] = '.';
		hyo[0][1] = ',';
		hyo[0][2] = '!';
		hyo[0][3] = '?';
		hyo[0][4] = ' ';


		for( i1=1; i1<9; i1++){
			for(i2=0; i2<4; i2++){
				
				if(i2 == 3) {

					if( i1 == 6 || i1 == 8) {}
					else continue;
				}

				hyo[i1][i2] = c;
				c++;
			}
		}



		cin >> n;

		for(i2=0;i2<n;i2++){


			cin >> s;

			count = 0;
			m = 0;
			for(i1=0;i1<s.size();i1++){
			

				if( s[i1]=='0'){
					if(m != 0){
						cc = moji(m,count);
						count = 0;
						m = 0;
					    cout << cc;
					}
				}
				else{

					c = s[i1];
					m = c - 48;
					count++;
				}
			}

			cout << endl;


		}

	return 0;

}


char moji(int char_, int count)
{

	int n;
	count--;
	if( char_ == 1){
		n = count%5;
	}
	else if( char_ == 7 || char_ == 9){
		n = count%4;
	}
	else {
		n = count%3;
	}

	return hyo[char_-1][n];
}

C++: #include <iostream>
#include <string>
using namespace std;
int main(){
	string a,b;
	while (cin>>a){
		if(a=="0") break;
		int la=a.size();
		int c=0;
		for(int i=0;i<la;i++){
			if(a[i]=='0'){
				if(b=="1"){
					c=c%5;
					if(c==1) cout<<".";
					if(c==2) cout<<",";
					if(c==3) cout<<"!";
					if(c==4) cout<<"?";
					if(c==0) cout<<" "; 
				}
				if(b=="2"){
					c=c%3;
					if(c==1) cout<<"a";
					if(c==2) cout<<"b";
					if(c==0) cout<<"c";
				}
				if(b=="3"){
					c=c%3;
					if(c==1) cout<<"d";
					if(c==2) cout<<"e";
					if(c==0) cout<<"f";
				}
				if(b=="4"){
					c=c%3;
					if(c==1) cout<<"g";
					if(c==2) cout<<"h";
					if(c==0) cout<<"i";
				}
				if(b=="5"){
					c=c%3;
					if(c==1) cout<<"j";
					if(c==2) cout<<"k";
					if(c==0) cout<<"l";
				}
				if(b=="6"){
					c=c%3;
					if(c==1) cout<<"m";
					if(c==2) cout<<"n";
					if(c==0) cout<<"o";
				}
				if(b=="7"){
					c=c%4;
					if(c==1) cout<<"p";
					if(c==2) cout<<"q";
					if(c==3) cout<<"r";
					if(c==0) cout<<"s";
				}
				if(b=="8"){
					c=c%3;
					if(c==1) cout<<"t";
					if(c==2) cout<<"u";
					if(c==0) cout<<"v";
				}
				if(b=="9"){
					c=c%4;
					if(c==1) cout<<"w";
					if(c==2) cout<<"x";
					if(c==3) cout<<"y";
					if(c==0) cout<<"z";
				}
				c=0;
				b="0";
			}
			else{
				b=a[i];
				c++;
			}
		}
		cout<<endl;
	}
    return 0;
}

C++: #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

/*

    1: . , ! ? (スペース)
    2: a b c
    3: d e f
    4: g h i
    5: j k l
    6: m n o
    7: p q r s
    8: t u v
    9: w x y z
    0: 確定ボタン 
*/

string button[10] = {" ", ".,!? ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

string conv(string str) {
  string res = "";
  char c = 'X';
  int num = 0;
  for (int i = 0; i < str.size(); ++i) {
    if (str[i] == '0') {
      if (num > 0) {
	int bu = c - '0';
	int ord = (num - 1) % button[bu].size();
	char add = button[bu][ord];
	res += add;
	num = 0;
      }
    }
    else {
      c = str[i];
      ++num;
    }
  }
  return res;
}

int main() {
  int n; cin >> n;
  for (int i = 0; i < n; ++i) {
    string str; cin >> str;
    cout << conv(str) << endl;
  }
}

C++: #include "bits/stdc++.h"

using namespace std;

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

    int n;cin>>n;
    vector<string> v;
    v.push_back("");v.push_back(".,!? ");v.push_back("abc");
    v.push_back("def");v.push_back("ghi");v.push_back("jkl");
    v.push_back("mno");v.push_back("pqrs");v.push_back("tuv");
    v.push_back("wxyz");
    for(int i=0;i<n;i++){
        string s;cin>>s;
        s+='0';
        string res="";
        int cnt=0,idx=0;
        for(int j=0;j<(int)s.length();j++){
            if(s[j]-'0' ==0){
                if(cnt==0) continue;
                res+=v[idx][(cnt-1)%(v[idx].length())];
                cnt=0;
            }
            else{
                idx=s[j]-'0';
                cnt++;
            }
        }
        cout<<res<<endl;
    }
}

C++: #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){   
  char m[9][5]={{'.',',','!','?',' '},
		{'a','b','c'},
		{'d','e','f'},
		{'g','h','i'},
		{'j','k','l'},
		{'m','n','o'},
		{'p','q','r','s'},
		{'t','u','v'},
		{'w','x','y','z'}};
  int a,count=0,c[100],d;
  char b[100][1024];
  cin>>a;
  for(int i=0;i<a;i++){
    scanf("%s",b[i]);
    c[i]=strlen(b[i]);
    for(int j=0;j<c[i];j++){

      if(b[i][j]!='0'){
	count++;
	d=(int)(b[i][j])-48;
      }
      else{
	if(b[i][j-1]!=0){
	  if(d==1)
	    if(count%5==0)
	      cout<<m[d-1][4];
	    else 
	      cout<<m[d-1][count%5-1];
	  
	  else if(d==7 || d==9)
	    if(count%4==0)
	      cout<<m[d-1][3];
	    else
	      cout<<m[d-1][count%4-1];
	  
	  else
	    if(count%3==0)
	      cout<<m[d-1][2];
	    else
	      cout<<m[d-1][count%3-1];
	  count=0;
	}
      }
    }
    cout<<endl;
  }
  return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

char bt[9][8] = {
    ".,!? ",
    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqrs",
    "tuv",
    "wxyz"
};

int main(){
    int N;
    char mes[80];
    for(scanf("%d", &N); N--;){
        scanf(" %s", mes);
        int len = strlen(mes);
        int prv = 0, count = 0;
        for(int i = 0; i < len; i++){
            if(mes[i] == '0'){
                if(prv > 0){
                    --prv;
                    printf("%c", bt[prv][--count % strlen(bt[prv])]);
                }
                count = 0;
            }else{
                count++;
            }
            prv = mes[i] - '0';
        }
        if(prv > 0){
            --prv;
            printf("%c", bt[prv][count % strlen(bt[prv])]);
        }
        puts("");
    }
    return 0;
}