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

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

ただいまの
回答率

88.93%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 319

yosukesan

score 1

前提・実現したいこと

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

#include <string>

using namespace std;

int main (){
    string s("HELLO_WORLD");

    for (char c: s)
        printf("%c", ('A'<=c && c<='Z') ? c+32 : c);
    printf("\n");

    return 0;
}

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

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]
              ^

該当のソースコード

package main

import "fmt"
import "strings"

func my_to_lower(c int) int {
    return c + 32;
}

func main(){
    var s string
    s = "HELLO_WORLD"
    ss := strings.Split(s,"")

    var c int;
    c = 'B';
    fmt.Printf("%c\n", my_to_lower(c)); // これは成功

    for i:=0; i<len(ss); i++ {
        var  w int  = ss[i]
        fmt.Printf("%d\n", w+32);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

package main

import "fmt"

func my_to_lower(c string) string {
    if c >= "A" && c <= "Z" {
        return string(c[0] + 32)
    } else {
        return c
    }
}

func main(){
    var s string
    s = "HELLO_WORLD\n"

    for i:=0; i<len(s); i++ {
        fmt.Print(my_to_lower(s[i:i+1]))
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/07 01:16

    ありがとうございます。手元で動作を確認しました。

    string を長さ 1 の配列として出力すると整数になる仕様なのですね。部分配列の作り方がわからず、strings.split() を使用していました。

    あとで、string の部分配列の扱いを、規格で確認したいと思います。

    キャンセル

  • 2020/07/07 01:30

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

    キャンセル

+1

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

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

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

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

package main

import (
    "fmt"
    "strings"
)

func my_to_lower(c rune) rune {
    if c >= 'A' && c <= 'Z' {
        return c + 32
    } else {
        return c
    }
}

func main() {
    s := "HELLO_WORLD\n"
    fmt.Println(strings.Map(my_to_lower, s))
}

追記

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

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

package main

import (
    "fmt"
)

func main() {
    s := "Hello, playground Golang!"
    for index, r := range s {
        fmt.Printf("%d:%q\n", index, r)
    }
}

出力例

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/07 12:40

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

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Goに関する質問
  • Golang で String から int 型へ変換して、ASCII table を利用した大文字->小文字変換をしたい。