質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

2回答

2225閲覧

Golang で String から int 型へ変換して、ASCII table を利用した大文字->小文字変換をしたい。

yosukesan

総合スコア41

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/07/06 15:09

編集2020/07/06 15:27

前提・実現したいこと

C++ でいう to_lower() などの関数を golang で自作したいのですが、string 型から int 型へ型変換できなのでしょうか?
golang では別の作法でしょうか? なお、組み込み関数で大文字に変換することは NG とさせていただきます。
c++ でいう以下がしたいです。

C++

1#include <string> 2 3using namespace std; 4 5int main (){ 6 string s("HELLO_WORLD"); 7 8 for (char c: s) 9 printf("%c", ('A'<=c && c<='Z') ? c+32 : c); 10 printf("\n"); 11 12 return 0; 13}

発生している問題・エラーメッセージ

yosuke@x250:~/Data/training/go/teratail$ go version go version go1.10.3 gccgo (Debian 8.3.0-6) 8.3.0 linux/amd64 yosuke@x250:~/Data/training/go/teratail$ go build main.go # command-line-arguments ./main.go:21:14: error: incompatible type in initialization (cannot use type string as type int) var w int = ss[i] ^

該当のソースコード

Golang

1package main 2 3import "fmt" 4import "strings" 5 6func my_to_lower(c int) int { 7 return c + 32; 8} 9 10func main(){ 11 var s string 12 s = "HELLO_WORLD" 13 ss := strings.Split(s,"") 14 15 var c int; 16 c = 'B'; 17 fmt.Printf("%c\n", my_to_lower(c)); // これは成功 18 19 for i:=0; i<len(ss); i++ { 20 var w int = ss[i] 21 fmt.Printf("%d\n", w+32); 22 } 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いちおうGoの作法として、文字単位での処理にはintではなくruneを使います。
runeはUCS-4というエンコードの1文字4バイト表現の型です(int32と変換可能)。

Goの文字列はUTF-8というエンコードで格納されていますのでインデックスアクセスはあまりお勧めしません。
(全角文字にたいして同様に小文字への変換を行う時に困ると思います)

当初の趣旨とは異なるかもしれませんが、
そういった処理を支援する機能がstringsパッケージにあります。
ご参考に。

https://play.golang.org/p/nIveFUTWKss

go

1package main 2 3import ( 4 "fmt" 5 "strings" 6) 7 8func my_to_lower(c rune) rune { 9 if c >= 'A' && c <= 'Z' { 10 return c + 32 11 } else { 12 return c 13 } 14} 15 16func main() { 17 s := "HELLO_WORLD\n" 18 fmt.Println(strings.Map(my_to_lower, s)) 19}

追記

Goでは文字列を for ... range の構文に載せると、文字のインデックスとruneをイテレートします。
このことは知っておくと競技の際に有効に使える(もしくは罠にはまらない)ので参考にしてください。
(indexの値が+1ずつの数列ではないことに注意)

https://play.golang.org/p/RjbrAJKW1DG

go

1package main 2 3import ( 4 "fmt" 5) 6 7func main() { 8 s := "Hello, playground Golang!" 9 for index, r := range s { 10 fmt.Printf("%d:%q\n", index, r) 11 } 12}

出力例

0:'H' 1:'e' 2:'l' 3:'l' 4:'o' 5:',' 6:' ' 7:'p' 8:'l' 9:'a' 10:'y' 11:'g' 12:'r' 13:'o' 14:'u' 15:'n' 16:'d' 17:' ' 18:'G' 21:'o' 24:'l' 27:'a' 30:'n' 33:'g' 36:'!'

投稿2020/07/06 23:21

編集2020/07/07 05:31
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yosukesan

2020/07/07 03:40

string 用の高階関数あるのですね。自作関数は競プロでしか使うことはないと思います。ありがとうございました。
guest

0

ベストアンサー

Goはほとんど知りませんが。

Go

1package main 2 3import "fmt" 4 5func my_to_lower(c string) string { 6 if c >= "A" && c <= "Z" { 7 return string(c[0] + 32) 8 } else { 9 return c 10 } 11} 12 13func main(){ 14 var s string 15 s = "HELLO_WORLD\n" 16 17 for i:=0; i<len(s); i++ { 18 fmt.Print(my_to_lower(s[i:i+1])) 19 } 20}

投稿2020/07/06 15:45

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yosukesan

2020/07/06 16:16

ありがとうございます。手元で動作を確認しました。 string を長さ 1 の配列として出力すると整数になる仕様なのですね。部分配列の作り方がわからず、strings.split() を使用していました。 あとで、string の部分配列の扱いを、規格で確認したいと思います。
otn

2020/07/06 16:30

文字列に添え字を付けると整数というのは、C等と同じですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問