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

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

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

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

3857閲覧

C#で標準入力から文字列を一文字ずつ読み込みString型にキャストして配列に入れる方法

退会済みユーザー

退会済みユーザー

総合スコア0

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/30 16:07

プログラミング初心者です。
調べて考えてみても分からず、teratailを通して質問させていただきました。言語はC#です。

質問内容に関してはタイトルにある通り、標準入力から文字列を一文字ずつ読み込み、文字として配列に入れたいのですが、どうもうまく行きませんでした。

下記のように書いていましたが、cannot implicitly convert 'int' to 'string'というエラーが表示されていました。

標準入力:A2BCD3
String[] abc = Console.Read();
エラー:cannot implicitly convert 'int' to 'string'

int型にキャストするint.Parse()と類似した、String型にキャストできるメソッドを探しましたが、自力では発見できず、こちらで質問させていただいた次第です。

標準入力からString型にキャストしながら一文字ずつ読み込み、String[] abcに格納できる方法はございますか。

また、もし上記のコード自体が間違っているなら、どのように直せば動作するでしょうか。

どうぞよろしくお願いいたします。

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

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

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

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

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

dodox86

2020/04/30 16:23

> 一文字ずつ読み込み、String[] abcに格納 とはどういう意味でしょうか。"abcd" と言う文字列があったら、string[] abc配列に {"a", "b", "c", "d"} と入れるということですか。char[] {'a', 'b', 'c', 'd'} の間違い、あるいは不適切なとらえ方なのではないですか。1文字づつ読み出さなければいけないのでしょうか。
退会済みユーザー

退会済みユーザー

2020/04/30 16:55

ご質問痛み入ります。 dodox86様が前半に仰いました通り、例えばabcdという標準入力があったとして、string[] abcに{“a”...”d”}と入れたいということです。 私自身理解が浅いため勘違いも多く、誤解を招く質問文になってしまいました。 大変失礼致しました。
dodox86

2020/04/30 17:03

既についたgentaroさんの回答を踏まえた上で考えてみると、また進捗もあろうかと思います。
退会済みユーザー

退会済みユーザー

2020/04/30 17:07

ご質問、誠にありがとうございました。 そうですね…今後のためにも、粘り強く自己解決していく姿勢を身につけて行きたいと思います。
dodox86

2020/04/30 17:18

ああ、いえ、必ずしも自己解決せよ、と言っているのではなく、gentaroさんの回答で案内されている公式のリファレンスおよびサンプルコードを読むと、今現在混乱しているところが理解できたり対応できたり、あるいはまた別のところが分からなくなるかもしれませんが、まず回答に向き合ってみましょう、と言う意味でのコメントでした。周りに聞く人がいないと勘違いしたまま進んでしまいいがちですし、そういうことの為の質問回答サイトでもあると思うので、自分で解決できなければ(適切な姿勢である限り)質問を続行して良いのではないでしょうか。(自分で粘り強く自己解決しようという姿勢自体は基本的に良いと思います)
gentaro

2020/04/30 18:33

提示した回答でConsole.Read()を使って標準入力から受け取った1文字ずつのデータをcharとして扱う方法はサンプル付きで解説されています。 このサンプルのコードをコピペしてデバッグしたりしながら、まずは動作を理解してください。 この次点で理解できない箇所があるのであれば、それを個別に潰していく必要があります。 あと必要なのは ・charとstringの違いが理解できているか ・stringの配列の宣言や初期化、値の変更や要素の追加の方法を理解できているか の二点だろうと思うので、それぞれ個別に丁寧に調べていけば解決できるはずです。
退会済みユーザー

退会済みユーザー

2020/04/30 23:10

ご返信が遅れました。 dodox86様、gentaro様、御二方共ご連絡ありがとうございます。 昨晩は教えていただいたサンプルコードを考えているうちに眠りに落ちてしまいました…(汗)。 dodox86様、決して責めている訳ではなく、どこが理解できていないのか深く分析ができていなかったなという自己反省のつもりでしたが、失礼しました。 もう少し回答と向き合ってみます。 gentaro様、サンプルコードのリンクと理解すべき要素の羅列、ありがとうございます。 char型とstringの違いも含めていくつかサンプルコード内で分からないものがありましたが、なんとなくここの部分でこういう処理をしているのかなということは理解できた気がしますので、 分からないところを一つずつ調べ、潰していこうと思います。 御二方とも、誠にありがとうございました。
Zuishin

2020/05/01 00:08 編集

少しややこしいことを言います。 文字列は string 型で、その一文字一文字は char 型です。これらを文字列型、文字型と言います。 Read は文字を読むので、その戻り値は本来なら char 型で良さそうですが、実際には int です。 なぜかと言うと、文字以外の戻り値を追加で返すためです。 つまり次の入力がなかった場合、文字型のオブジェクトを返したのでは、その文字が入力されたものと区別できません。そこで文字型に高速に変換することができながら文字型より多くの値を表現できる int を使い、文字としてはあり得ない値(つまり -1)を終了コードとして割り当てました。 Read を使う場合にはまず戻り値が -1 かどうかを確かめ、次にそれを char 型に変換するのがよく使われる方法です。これは C 言語由来の方法でもあります。 そこで公式を見てみると、それとはまったく違う方法を使っています。実はややこしいのですが、これは先ほど述べた方法に比べて新しい方法であり、現在では時代遅れとなった方法でもあります。 この方法ではまず Convert.ToChar を用いて入力を文字型に変換します。Convert.ToChar は文字型にできない値を与えた場合に例外を起こすので、終了コードである -1 は例外を発生させます。この例外をキャッチしてメッセージを表示することで、その終了コードを処理(この場合は終了コードでは終了せず、単にエラーとして扱い、別の文字「+」で終了する仕様になっている)しています。 現在では、みだりに例外を使うのは避ける傾向にあるので、このようなコード(Convert.ToChar)は使わず、戻り値が char.MinValue 以上 char.MaxValue 以下であることをチェックして、そうであった場合には (char)c のようにキャストし、そうでなかった場合には適切に処理するのが推奨されます。 ではなぜ公式にこの古い方法がいつまでも載っているかというと、実はこの質問のようなことをしたい場合、Read 自体使いません。Console.Read というメソッド自体が使い道の少ないメソッドになっているのです。ではどうするかと言うと、まず ReadLine などを使って多くのデータを読み込み、それを LINQ で処理します。 例えば入力から一行読み込み、文字型の配列にするには次のように書きます。 var array = Console.ReadLine().ToArray(); この一行で文字型の配列 array を取得できます。 ただしこれは入力があることが前提です。ReadLine は入力が無かった場合に null を返すので、これでは例外が発生します。そこで次のようにします。 var array = Console.ReadLine()?.ToArray(); これで入力が無かったことによる例外は発生しません。入力が無かった場合には array が null になるので、これをチェックして終了処理に入ります。
退会済みユーザー

退会済みユーザー

2020/05/01 00:45

Zuishin様、長文による詳しい解説、痛み入ります。 なるほど…メソッドの種類によって用途も様々なのですね。 入力が無かったことによる例外の発生を回避する方法も目から鱗で、大変有意義な学びとなりました。 誠にありがとうございました。
dodox86

2020/05/01 00:58

私も一部、認識を新たにしたところがありました。勉強になりました。
Zuishin

2020/05/01 04:04

あれ? ベストアンサーついてなかったっけ? わからない時には公式サイトを調べるという回答はまったく正しく、私はそれに異を唱えたわけではありません。公式にも正しい情報が書いてあり、その方法で問題なくプログラミングできます。それはそれとして、同時に新しい情報を入れた方が良いという提案です。
退会済みユーザー

退会済みユーザー

2020/05/01 04:15

Zuishin様 ご指摘ありがとうございます。なるほど、私の解釈に誤りがあったようです。 再びになりますが、ベストアンサーをつけておきます。 ありがとうございました。
guest

回答1

0

ベストアンサー

公式のリファレンスぐらいは読んでみましょう。
Console.Read メソッド

投稿2020/04/30 16:55

gentaro

総合スコア8947

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

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

退会済みユーザー

退会済みユーザー

2020/04/30 23:13

リンクを貼っていただき、誠にありがとうございます 公式リファレンスには目を通していませんでしたので、お恥ずかしい限りです。 サンプルコードを元に、理解できていないところを徐々に減らして行きたいと思います。
gentaro

2020/04/30 23:30

頑張ってください。 また、ネット上には「標準入力」を受け取るサンプルコードは山ほど転がってると思うので、検索して色々目を通してみるのも良いと思います。 その中で不明なことが出てきたらまずは公式のリファレンス等の読み、それでも理解できないものはググってみて、それでも解決できなさそうならまた質問してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問