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 <bits/stdc++.h>

int main() {

  int left, right;
  char key[10][10] = {
    {},
    {'.', ',', '!', '?', ' '},
    {'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 size[10] = {0, 5, 3, 3, 3, 3, 3, 4, 3, 4};
  int N;
  char str[1024];
  
  std::cin >> N;
  
  for(int t = 0; t < N; ++t) {  
    scanf("%s", str);

    std::vector<char> buffer;
    int n = strlen(str);
  
    left = right = 0;
    for(int i = 0; right <= n; ++right) {
      if( str[left] != str[right] ) {
        if( str[left] != '0' ) {
          buffer.push_back(key[str[left] - '0'][(right-left-1)%size[str[left]-'0']]);
        }
        left = right;
      }
    }
    buffer.push_back('\0');

    std::cout << &buffer[0] << std::endl;
    buffer.clear();
  }
  
  return 0;
}

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

int boo(int x, int y){
	if(x%y) return x%y -1;
	else return y - 1;
}

char foo(string str,int mk, int i){
	char ch, mozi[16] = "00adgjmptw", mozi1[8] = " .,!?";
	if(str[mk] - '0' == 1) ch = mozi1[(i - mk)%5];
	else if(((str[mk] - '0') == 7) || ((str[mk] - '0') == 9)) ch = mozi[str[mk] - '0'] + boo(i - mk, 4);
	else ch = mozi[str[mk] - '0'] + boo(i - mk, 3);
	return ch;
}

int main(){
	int N, mk, count, temp;
	int i, j, k;
	string str;
	char ch[2000];
	
	cin>>N;
	
	for(i = 0; i < N; i++){
		mk=0; count=0;
		cin>>str;
		for(j = 0; j < (int)str.size(); j++){
			if(str[j] == '0'){
				if(mk != j)ch[count++] = foo(str, mk, j);
				mk =  j + 1;
			}
		}
		
		for(j = 0; j < count; j++) cout<<ch[j];
		if(count)cout<<endl;
	}
	
	return 0;
}

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

int main(){

  string s;
  int n;
  char in;
  int num=0 , count=0;

  cin >> n;
  getchar();

  for(int i=0; i<n; i++){

    s = "";
    
    while(scanf("%c",&in)){
      if(in == '\n' ){ break; }

      else if(in == '0'){
 
	  if(num==2)
	    s += 'a'+(count-1)%3;
	  else if(num==3)
	    s += 'd'+(count-1)%3;
	  else if(num==4)
	    s += 'g'+(count-1)%3;
	  else if(num==5)
	    s += 'j'+(count-1)%3;
	  else if(num==6)
	    s += 'm'+(count-1)%3;
	  else if(num==7)
	    s += 'p'+(count-1)%4;
	  else if(num==8)
	    s += 't'+(count-1)%3;
	  else if(num==9)
	    s += 'w'+(count-1)%4;
	  else if(num==1){
	    switch((count-1)%5){
	    case 0: s+='.'; break;
	    case 1: s+=','; break;
	    case 2: s+='!'; break;
	    case 3: s+='?'; break;
	    default: s+=' ';
	    }
	  }

	  num = 0;
	  count = 0;

      }
      //kakutei

      else{
	if(in-'0' == num)
	  count ++;
	else{
	  num = in-'0';
	  count = 1;
	}
      }
    }
    //while

    cout << s << endl;

  }
	    
  return 0;
}

C++: #include<stdio.h>
int main()
{
  char c;
  int n;
  int out;
  int end;
  int i;
  scanf("%d",&n);
  for(i=0;i<n+1;i++)
    {
      end=0;
      while(1)
	{
	  out=0;
	  while(1)
	    {
	      scanf("%c",&c);
	      if(out==0)
		{
		  switch(c)
		    {
		    case '1':
		      out=1;
		      break;
		    case '2':
		      out=6;
		      break;
		    case '3':
		      out=9;
		      break;
		    case '4':
		      out=12;
		      break;
		    case '5':
		      out=15;
		      break;
		    case '6':
		      out=18;
		      break;
		    case '7':
		      out=21;
		      break;
		    case '8':
		      out=25;
		      break;
		    case '9':
		      out=28;
		      break;
		    }
		}
	      else
		{
		  switch(c)
		    {
		    case '1':
		      if(out==5) out=1;
		      else out++;
		      break;
		    case '2':
		      if(out==8) out=6;
		      else out++;
		      break;
		    case '3':
		      if(out==11) out=9;
		      else out++;
		      break;
		    case '4':
		      if(out==14) out=12;
		      else out++;
		      break;
		    case '5':
		      if(out==17) out=15;
		      else out++;
		      break;
		    case '6':
		      if(out==20) out=18;
		      else out++;
		      break;
		    case '7':
		      if(out==24) out=21;
		      else out++;
		      break;
		    case '8':
		      if(out==27) out=25;
		      else out++;
		      break;
		    case '9':
		      if(out==31) out=28;
		      else out++;
		      break;
		    }
		}
	      if(c=='\n')
		{
		  end=1;
		  break;
		}
	      if(c=='0') break;
	    }
	  switch(out)
	    {
	    case 1:
	      printf(".");
	      break;
	    case 2:
	      printf(",");
	      break;
	    case 3:
	      printf("!");
	      break;
	    case 4:
	      printf("?");
	      break;
	    case 5:
	      printf(" ");
	      break;
	    case 6:
	      printf("a");
	      break;
	    case 7:
	      printf("b");
	      break;
	    case 8:
	      printf("c");
	      break;
	    case 9:
	      printf("d");
	      break;
	    case 10:
	      printf("e");
	      break;
	    case 11:
	      printf("f");
	      break;
	    case 12:
	      printf("g");
	      break;
	    case 13:
	      printf("h");
	      break;
	    case 14:
	      printf("i");
	      break;
	    case 15:
	      printf("j");
	      break;
	    case 16:
	      printf("k");
	      break;
	    case 17:
	      printf("l");
	      break;
	    case 18:
	      printf("m");
	      break;
	    case 19:
	      printf("n");
	      break;
	    case 20:
	      printf("o");
	      break;
	    case 21:
	      printf("p");
	      break;
	    case 22:
	      printf("q");
	      break;
	    case 23:
	      printf("r");
	      break;
	    case 24:
	      printf("s");
	      break;
	    case 25:
	      printf("t");
	      break;
	    case 26:
	      printf("u");
	      break;
	    case 27:
	      printf("v");
	      break;
	    case 28:
	      printf("w");
	      break;
	    case 29:
	      printf("x");
	      break;
	    case 30:
	      printf("y");
	      break;
	    case 31:
	      printf("z");
	      break;
	    }
	  if(end) break;
	}
      if(i!=0) printf("\n");	 
    }
  return 0;
}