Edited at

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

More than 1 year has passed since last update.


背景

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])
}
}