ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3988856 C#の質問
質問者:TAN2005 コンソールからの入力で2つの整数を取得したいのですが、
下記のように、2行に渡って取得する他ないのでしょうか?

Console.WriteLine("何行何列ですか?");
int gyou = Convert.ToInt32(Console.ReadLine());
int retu = Convert.ToInt32(Console.ReadLine());

私としましては、ユーザーに2,3のように1行で入力してもらって、
gyouには2をretuには3を保存したいのですが・・・。
そんなことは可能でしょうか?
どなたかご教授お願いいたします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/01 00:34
この質問に対する回答は締め切られました。

回答良回答10pt

ANo.6 #No.5です。
>string str = new string(new char[]{'1','2'});
>の意味がわかりません。

string はクラスです。なので、
string str=new string(new char[]{'1','2'});
のように、オブジェクトを作らなければなりません。
しかし、これでは面倒なので、
string str="12";
のように文字列を代入できるようになっています。

>配列の初期化じゃないのになぜnew演算子をつかっているんですか?

クラス(参照型)や、配列などは、new演算子などでオブジェクトを生成して、初期化とかしないといけません。
(ただし、string型やobject型のような一部のクラスはnewでオブジェクトを生成しなくても良いし、することが出来ないものもある。)
構造体(値型)はnew演算子でオブジェクトを生成できますし、newしなくてもできます。ただし、インターフェイスを継承した場合は、new演算子でオブジェクトを作成しないといけません。
回答者:nagaimoken
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/03 11:21
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.5 >string[] split = buf.Split(new Char[] { ',' });
>が分からないんですよね。

例えば、
string str = new string(new char[]{'1','2'});
これってつまり、
string str="12";
ということです。
string []sprit=buf.Split(new Char[]{','});
は戻り値がstring型の配列なので、文字列の中に','があったとき、string 型の配列を作成して、','で分けた文字列をspritに返すと考えればわかり易いかもしれません。

とりあえず、適当にサンプル作ってみました。
bool b = false;
do
{
try
{
b = true;
Console.WriteLine("数値を入力してください 例:数値,数値");
string[] split = Console.ReadLine().Split(new char[]{','});
int gyou = Convert.ToInt32(split[0]);
int retu = Convert.ToInt32(split[1]);
Console.WriteLine("gyou={0},retu={1}", gyou, retu);
}
catch
{
b = false;
Console.WriteLine("数値を入力してください");
}
} while (b==false);
回答者:nagaimoken
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/02 12:33
この回答への補足string str = new string(new char[]{'1','2'});
の意味がわかりません。
配列の初期化じゃないのになぜnew演算子をつかっているんですか?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答20pt

ANo.4 ご質問なさる時はお使いの環境を書いたほうがよろしいかと思います。
# 正しい回答が欲しいならOS や開発環境などを必ず書くべきです。

ANo.2 の補足から引用
> 普通配列を宣言・初期化するときは、
> string[] split = new buf[要素数]{初期値, ・・・};
> でしますよね?

あなたが仰っているのは string[] split についてかと思われますが

> なんで、buf.Split(new Char[] { ',' });でsplitの宣言・初期化
> できるんですか??

落ち着いてよく見ましょう、Split() の引数は char 配列となっていて
new char[] {','} は、丁寧に引数の配列の初期化をしているだけです。
また、配列は Split() で割り当てされます。

string[] split = Console.ReadLine().Split(',');
のように書いても可能ですが。

ちなみに Split() の引数は char[] 以外に他にもあります。
# というか、まずマニュアルを見るべきでしょう。

ANo.1 の補足から引用
> 数字以外の物が入力された時にエラー表示を出すにはどうすれば
> よいのでしょうか?

TryParse がありますが、前述のようにあなたのお使いの環境についての
記述がないので、動くかどうかはわかりません。

# TryParse が使えない場合は Try, Catch 等で対処可能です。

文字列を数値に変換するには?(TryParse編)[2.0のみ、C#、VB] − @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/408tryparse/tryparse.html

その他の入力数値の最大・最小のチェックは if 等で条件分岐処理すれば済みます。

# これについてのご質問であれば承りますが、他のご回答者の方の回答の
# 説明ですので私へのお礼などは要りません。
# あなたが望むものであった場合は、私以外のご回答者の方にお礼をする
# べきです。
回答者:x415f484f
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/02 04:43
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.3 前提として、私はC#使ったことも勉強したこともないので間違った答えかもしれません。

string 型の配列を格納する変数(誤解を恐れず言えば string[] 型の変数) split を定義して、その内容として String.Split() の戻り値を受けているだけです。
配列自体は初期化してません。
分離すると↓
string[] split;
split = buf.Split(...);

MSDNのサンプルでこのように使っているので、実体は String.Split() の中で作られているものと判断しました。
回答者:_himajin_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 20:37
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 参考URL載せ忘れてましたので、↓を見てください。
http://msdn.microsoft.com/ja-jp/library/b873y76a(VS.80).aspx

ここの使用例から少し改変して例示させていただいただけなので、詳しく説明はできないのですが
Console.ReadLine() で読んだ buf を区切り文字として ',' で分割して string の配列 split に入れているつもりです。

エラー処理に関しては Convert.ToInt32 のサンプル↓が参考になるのではないでしょうか。
http://msdn.microsoft.com/ja-jp/library/sf1aw27b(VS.80).aspx
回答者:_himajin_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 12:31
この回答への補足どうしても、
string[] split = buf.Split(new Char[] { ',' });
が分からないんですよね。
普通配列を宣言・初期化するときは、
string[] split = new buf[要素数]{初期値, ・・・};
でしますよね?
なんで、buf.Split(new Char[] { ',' });でsplitの宣言・初期化できるんですか??
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 Console.ReadLine() で受け取った文字列を、',' までを文字列1、それ以降を文字列2に分割してあげれば可能なはずです。
String.Split() で文字列の配列として受け取れるようなので、これでできるんじゃないでしょうか。
// C#使ったことないので動くかどうかはわかりません。
// ついでにエラーチェックもいれてないのであくまでも参考程度にどうぞ
string buf = Console.ReadLine();
string [] split = buf.Split(new Char [] {','});
int gyou = Convert.ToInt32(split[0]);
int retu = Convert.ToInt32(split[1]);
回答者:_himajin_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 01:28
この回答への補足string[] split = buf.Split(new Char[] { ',' });
この行の意味がイマイチ分からないのですが詳しく教えていただけませんか?
また、数字以外の物が入力された時にエラー表示を出すにはどうすればよいのでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)