2016-06-29 37 views
1

文字と整数のリストがあり、文字列に変換しようとしています。文字列と文字列のリストを文字列に変換する方法

> (define l (cons #\a (cons #\b (cons 3 null)))) 

このリストを文字列"ab3"に変換したいとします。

動作しないlist->stringを使用する:

> (define l (cons #\a (cons #\b (cons (integer->char 3) null)))) 
> (list->string l) 
"ab\u0003" 

が動作しないかんnumber->stringを使用して::

> (list->string l) 
list->string: contract violation 
    expected: (listof char?) 
    given: (list #\a #\b 3) 

私はinteger->charと組み合わせることをしようと、それはこの数値を与えます

> (define l (cons #\a (cons #\b (cons (number->string 3) null)))) 
> (list->string l) 
list->string: contract violation 
    expected: (listof char?) 
    given: '(#\a #\b "3") 
    context...: 
    C:\Program Files\Racket\collects\racket\private\misc.rkt:87:7 

list->stringが必要ですcharsのist、それは文字列を受け入れません。

もう一つは、最初のリストに文字列を変換し、試してみてください。

> (define l (cons #\a (cons #\b (cons (string->list (number->string 123)) null)))) 
> (list->string l) 
list->string: contract violation 
    expected: (listof char?) 
    given: '(#\a #\b (#\3)) 
    context...: 
    C:\Program Files\Racket\collects\racket\private\misc.rkt:87:7 

それはどちらかサブリストを受け付けません。これを文字列"ab3"に変換するにはどうすればよいですか?

+0

あなたの本当の問題があると思われる、私は#\ 3' 'のような文字に3''のように整数に変換しますか。 'integer-> char'は3番目のASCII文字を取るので、それは正しい関数ではありません。あなたが望むのは 'number-> string'のようなものでしょうか?あなたの整数はいつも[0,9]以内ですか? –

+0

申し訳ありませんでしたが、私は文字列に数値、ASCIIコードに数字ではなく数字を10以上にすることを望んでいます。 – fluter

+0

文字通りすべての文字を文字列に変換してから'list-> string'の代わりに' string-append'を使います。 –

答えて

2

文字と整数のリストを処理し、それらをすべて1つの文字列で連結したいとします。例えば

(define (process lst) 
    (apply string-append     ; append all the strings 
     (map (lambda (e)    ; create a list of strings 
       (if (char? e)   ; if it's a char 
        (string e)   ; convert it to string 
        (number->string e))) ; same if it's a number 
       lst))) 

(process (list #\a #\b 123 #\c)) 
=> "ab123c" 
+0

'list-> string'はすでに' apply string'とまったく同じことを行っていますが、それはOPの問題ではありません。問題は 'integer-> char'が期待したことをしていないことです。 –

+0

@AlexKnauth ok、私はそれが今正しいと信じている –

+0

@fluterのコメントでは、数字は10を超える可能性があり、その場合は文字ではないでしょう。 'number-> string'は本当に必要なもので、' num-> char'関数ではありません。もちろん、「文字のリストを文字列に変換する方法」ではなく、文字と文字列のリストを文字列に変換することです。 –

0

チャー値を有するタイプであり、これを試してください。この値は、ユニコードで定義され、65が大文字の場合A66が大文字の場合Bです。すべての文字は整数値を持ち、char->integerは文字から数字のUnicode値に変換し、integer->charはUnicode値から文字に変換します。

数字は9である57にゼロ(#x39)である(#x3048から始まります。したがって、(list->string (list #\a #\b (integer->number #x33))) ; ==> "ab3"

数値はnumber->stringの文字列に変換できます。例えば。 (number->string 123) => "123"。これはベース10に表示されますが、もしそれが16進数で表示されたいのであれば(number->string 123 16) ;==> "7b"です。 list->stringは、文字のリストしか取らず、数字のような他の要素を持つことはできないことに注意してください。

あなたはstring-appendと一緒に多くの文字列を結合することがあります。

(string-append (list->string '(#\a #\b)) 
       (number->string #x7b) 
       "c") 
; ==> "ab123c" 
+0

'#x7b'とは何ですか?私はそれが16進数だと知っていますが、なぜそれが '123'の代わりになるのでしょうか? –

+0

@AlexKnauth彼らが最初に見た '7b'ではないので、私はちょうど両方の基地で123を使用しています。 – Sylwester