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<math.h>
#include <string>
#include <stack>
#include<stdio.h>
#include <queue> 
#include <functional>
#define rep(i,n) for (int i=0; i < (int)(n); i++)

using namespace std;

int main(){
	
	stack<int> st; // スタックを宣言＋初期化
	
	int a,b,c,d,e,num;
	int i,j,k;
	int arr[100];
	int arr2[100][100];
	char x,y,z;
	char crr[100];
	char crr2[100][100];
	string str2;
	string str;
	stack<int> istk; // 整数値を格納するスタックを宣言
    stack<string> sstk; // 文字列を格納するスタックを宣言	
	queue<int> ique; // 整数値を格納するキューを宣言
    queue<string> sque; // 文字列を格納するキューを宣言

	
	
	cin >> num;
	
	rep(i , num){
		
		
		cin >> str;
		

		
		j = 0;
		
		
		while(1){
			
			x = NULL;
			
			if(str[j] == NULL) break;
		
			switch(str[j]){
				
				case '0':
				
				j=j+1;
					break;
					
					
	
				case '1':
				
				
				x = '.';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == '.' ) x = ',';
					else if(x == ',' ) x = '!';
					else if(x == '!' ) x = '?';
					else if(x == '?' ) x = ' ';
					else x = '.';
					j = j+1;
				}
				j = j+1;
					break;
					
				case '2':
				
				
				x = 'a';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'a' ) x = 'b';
					else if(x == 'b' ) x = 'c';
					else x = 'a';
					j = j+1;
				}
				j = j+1;
					break;
				case '3':
				
				
				x = 'd';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'd' ) x = 'e';
					else if(x == 'e' ) x = 'f';
					else x = 'd';
					j = j+1;
				}
				j = j+1;
					break;
				case '4':
				
				
				x = 'g';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'g' ) x = 'h';
					else if(x == 'h' ) x = 'i';
					else x = 'g';
					j = j+1;
				}
				j = j+1;
					break;
				case '5':
				
				
				x = 'j';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'j' ) x = 'k';
					else if(x == 'k' ) x = 'l';
					else x = 'j';
					j = j+1;
				}
				j = j+1;
					break;
				case '6':
				
				
				x = 'm';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'm' ) x = 'n';
					else if(x == 'n' ) x = 'o';
					else x = 'm';
					j = j+1;
				}
				j = j+1;
					break;
				case '7':
				
				
				x = 'p';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'p' ) x = 'q';
					else if(x == 'q' ) x = 'r';
					else if(x == 'r' ) x = 's';
					else x = 'p';
					j = j+1;
				}
				j = j+1;
					break;
				case '8':
				
				
				x = 't';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 't' ) x = 'u';
					else if(x == 'u' ) x = 'v';
					else x = 't';
					j = j+1;
				}
				j = j+1;
					break;
				case '9':
				
				
				x = 'w';
				j = j+1;
				while(1){
					if(str[j] == '0') break;
					if(x == 'w' ) x = 'x';
					else if(x == 'x' ) x = 'y';
					else if(x == 'y' ) x = 'z';
					else x = 'w';
					j = j+1;
				}
				j = j+1;
					break;

			}
			
//			str2[k] = x;
//			k = k+1;
			if(x == NULL ) continue; 
			cout << x;		

				
				
		}
		
		cout << endl;
		
		
		
	}
		
	return 0;
		
}

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

int main(){
  int prev=10,n,c=0;
  string str;
  char s,buf='\0';
  char keymap[9][5]={ {'.',',','!','?',' '},
		      {'a','b','c','\0','\0'},
		      {'d','e','f','\0','\0'},
		      {'g','h','i','\0','\0'},
		      {'j','k','l','\0','\0'},
		      {'m','n','o','\0','\0'},
		      {'p','q','r','s','\0'},
		      {'t','u','v','\0','\0'},
		      {'w','x','y','z','\0'}};
  cin>>n;

  while(n--){
    cin>>str;
    for(int i=0;i<str.length();i++){
      s=str.at(i);
      if(c!=0&&s=='0')cout<<buf,c=0,buf='\0';
      switch (s){
      case '1':
	buf=keymap[0][(c++)%5];
	break;
      case '2':
	buf=keymap[1][(c++)%3];
	break;
      case '3':
	buf=keymap[2][(c++)%3];
	break;
      case '4':
	buf=keymap[3][(c++)%3];
	break;
      case '5':
	buf=keymap[4][(c++)%3];
	break;
      case '6':
	buf=keymap[5][(c++)%3];
	break;
      case '7':
	buf=keymap[6][(c++)%3];
	break;
      case '8':
	buf=keymap[7][(c++)%4];
	break;
      case '9':
	buf=keymap[8][(c++)%3];
	break;
      }
    }
    buf='\0';
    cout<<endl;
  }
}

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

int data[10][6]={
  {5,'.',',','!','?',' '},
  {3,'a','b','c',0,0},
  {3,'d','e','f',0,0},
  {3,'g','h','i',0,0},
  {3,'j','k','l',0,0},
  {3,'m','n','o',0,0},
  {4,'p','q','r','s',0},
  {3,'t','u','v',0,0},
  {4,'w','x','y','z',0}
};

int main(){
  int n;
  cin>>n;
  string s;
  for(int i=0;i<n;i++){
    cin>>s;
    for(int j=0;j<s.length();j++){
      if(s[j]=='0')continue;
    int tmp=j;
    while(s[j]!='0')j++;

    int button=s[j-1]-'0'-1;
    int cnt=(j-tmp-1)%data[button][0] + 1;

    cout << (char)data[button][cnt];
    }
    cout << endl;
  }
  return 0;
}

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

int main()
{
	int cycle[10] = { 1, 5, 3, 3, 3, 3, 3, 4, 3, 4 };
	char c[10][5] =
	{
		{ '0' },
		{ '.', ',', '!', '?', ' ' },
		{ '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 n;
	cin >> n;
	while (n--)
	{
		string s;
		cin >> s;

		int count = 0;
		char output = '0';

		for (char i : s)
		{
			if (i == '0' && output != '0')
			{
				cout << output;
				output = '0';
				count = 0;
			}
			output = c[i - '0'][count];
			count++;
			if (count >= cycle[i - '0']) count = 0;
		}
		cout << endl;
	}

	return 0;
}