C
Go
golang
Go言語

Golangの翻訳は難しい。。。(その1)

背景

C言語をGolangに翻訳しているが、なかなか難しい。

反復処理(基本的にforのみ?)とか、文字列(char型がGolangにはない)とか。

で、今「入力文字列から母音の数を数え上げるプログラム」を作っているのだが、"string"、"byte"、"rune"型で見事にこけている。

打開策をご存知の方、教えていただけますと幸いです。

Cコード

2-3.c
#include <stdio.h>

int main(void)
{
    char moziretu[100] = {};
    char boin[5] = {'a', 'i', 'u', 'e', 'o'};
    int count[5] = {};  /*各要素は配列boinの文字に対応。(count[0]に'a'のカウント数を代入)*/

    int i;
    int j = 0;



    printf("文字列>>>");
    /*文字列を入力*/
    scanf("%s", moziretu);

    /*エンターが読み込まれるまで繰り返す*/
    while(moziretu[j] != '\0'){
        for(i = 0; i < 5; i++){
            /*文字列に母音が見つかればカウント*/
            if(moziretu[j] == boin[i]) count[i]++;
        }
        j++;
    }

        /*母音の数を表示*/
    for(i = 0; i < 5; i++){
        printf("%c : %d\t", boin[i], count[i]);
    }

    printf("\n");
    return 0;
}

Golangコード

2-3.go
package main

import "fmt"

func main(){
    /*入力文字列の定義*/
    var input string

    /*母音を格納する配列*/
    boin := []rune{'a', 'i', 'u', 'e', 'o'}

    /*各母音の数え上げ回数*/
    count := []int{0, 0, 0, 0, 0}

    /*ループ用*/
    i := 0
    j := 0

    /*文字列の入力*/
    fmt.Printf("String>>>")
    fmt.Scanln("%s", &input)
    str := []rune(input)

    /*エンターが読み込まれるまで繰り返し*/
    for {
        for i = 0; i < 5; i++ {
            /*文字列に母音が見つかればカウント*/
            if str[j] == boin[i] {
                count[i] += 1
            }
        }
        if str[j] == '\x00' {
            break
        }
        j += 1
    }

    /*母音の数を表示*/
    for i = 0; i < 5; i++ {
        fmt.Printf("%s : %d\n", boin[i], count[i])
    }
}

ちなみに、上記のGolangコードを実行するとpanicを起こす。

$ go run 2-3.go
String>>>panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x4e8200, 0xc82000a0e0)
        /usr/lib/go-1.6/src/runtime/panic.go:481 +0x3e6
main.main()
        /home/yuki-f/Golang/pro2/2-3.go:28 +0x55f
exit status 2

追記

直った。

package main

import "fmt"

func main(){
    /*入力文字列の定義*/
    var input string

    /*母音を格納する配列*/
    boin := []rune{'a', 'i', 'u', 'e', 'o'}

    /*各母音の数え上げ回数*/
    count := []int{0, 0, 0, 0, 0}

    /*ループ用*/
    i := 0
    j := 0

    /*文字列の入力*/
    fmt.Printf("String>>>")
    fmt.Scanf("%s", &input)
    str := []rune(input)

    /*エンターが読み込まれるまで繰り返し*/
    for j < len(str){
        for i = 0; i < 5; i++ {
            /*文字列に母音が見つかればカウント*/
            if str[j] == boin[i] {
                count[i] += 1
            }
        }
        j += 1
    }

    /*母音の数を表示*/
    for i = 0; i < 5; i++ {
        fmt.Printf("%c : %d\n", boin[i], count[i])
    }
}