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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Q&A

解決済

4回答

1056閲覧

char配列を正常にstringに変換できない

Wings-12

総合スコア18

C#

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

0グッド

0クリップ

投稿2019/01/20 09:07

前提・実現したいこと

C#でN 個の 2 進数のデータに対して排他的論理和(xor) を取った結果を 4 桁の 2 進数で出力
するプログラムを作っています。

そのためにchar配列をstringに変換する機能を実装中に以下の問題が発生しました。

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

以下の「該当のソースコード」の、 string output = new string(charAnsArray); int intOutput = int.Parse(output); Console.WriteLine(string.Format("{0:0000}", intOutput)); の部分の、 string output = new string(charAnsArray);の部分で、 char配列を正常にstringに変換できなくて困っています。

該当のソースコード

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CsharpPractice { class Program { static void Main(string[] args) { int inputCount = 2; int[] inputs = new int[inputCount]; inputs[0] = 0011; inputs[1] = 0110; int answer = 0; for (int i = 0; i < inputCount; i++) { answer += inputs[i]; } string strAns = answer.ToString(); char[] charAnsArray = strAns.ToCharArray(); int[] finalAns = new int[charAnsArray.Length]; char[] finalCharAnsArray = new char[charAnsArray.Length]; for (int i = 0; i < finalAns.Length; i++) { finalAns[i] = (int)charAnsArray[i]; finalAns[i] %= 2; finalCharAnsArray[i] = (char)finalAns[i]; } string output = new string(charAnsArray); int intOutput = int.Parse(output); Console.WriteLine(string.Format("{0:0000}", intOutput)); Console.WriteLine(); Console.ReadKey(); } } }

試したこと

ToString()を使って変換しようとしましたが、
上手くいきませんでした。

補足情報(FW/ツールのバージョンなど)

PCはWindows10, エディターはVisual Studio2015を使用しています。

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

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

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

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

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

ozwk

2019/01/20 09:24

正常に変換できないっていうのはどういう状況ですか?
Wings-12

2019/01/20 21:31

すみません。お答えさせていただく前に、 string output = new string(charAnsArray); ではなく、 string output = new string(finalCharAnsArray); で問題が起きています。 失礼いたしました。 このときに、 "\u0001\0\u0001" という文字列に変換されてしまい、 どうすれば"0101"で出力されるかわからなくて困っています。
guest

回答4

0

2進数と10進数を区別するための表記をご存じないのでは?

C#

1inputs[0] = 0011; 2inputs[1] = 0110;

ここは2進数の00110110を代入したいのですよね?
この記述だと10進数の十一百十の代入になります。

C#

1inputs[0] = 0b0011; 2inputs[1] = 0b0110;

0bをつけると2進数扱いとなります。

また、出力時ですが、

C#

1Console.WriteLine(string.Format("{0:0000}", intOutput));

とされていますが、これではintOutputを10進数で出力します。
2進数の文字列とするには下記のようにします。

C#

1Convert.ToString(intOutput,2);

また、上記ですと、先頭の0埋めはされませんので、

C#

1String.PadLeft(桁数, '0');

とすれば、指定桁数で0埋めされます。

また、finalAnsとかfinalCharAnsArrayを利用していませんが、いいのですか?

追記

すみません、VisualStudio2015というのを見落としていました。
0bの2進数リテラルはC#7から使用できます。
それ以前ですと Convert.ToInt32("0011", 2)のようにConvertを使うのが分かりやすいかと思います。

投稿2019/01/20 12:03

編集2019/01/20 14:33
YAmaGNZ

総合スコア10258

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

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

0

ベストアンサー

string output = new string(charAnsArray);

ではなく、
string output = new string(finalCharAnsArray);
で問題が起きています。

(そこにかいてもあまりリーチしないです)

  • 原因

charである'1'をintでみると49です(Console.Write((int)'1');)。

  • 対策

csharp

1 for (int i = 0; i < finalAns.Length; i++) 2 { 3// finalAns[i] = (int)charAnsArray[i]; 4 finalAns[i] = (int)char.GetNumericValue(charAnsArray[i]); 5 finalAns[i] %= 2; 6// finalCharAnsArray[i] = (char)finalAns[i]; 7 finalCharAnsArray[i] = finalAns[i].ToString()[0]; 8 }

charを数値にするメソッドを使う(他にも48引くというこも可能ですが)、ToString()で文字を得る(48を足してもいいですが)、とかをしないと望みどおりにはならないです。

余談
おそらくこれは何らかの練習コードだと思うのですが(実用なら演算子でXORすればいいので)、それでも

csharp

1//宣言 2public static IEnumerable<int> Xor(IEnumerable<int> a, IEnumerable<int> b) => a.Zip(b, (i,j)=>(i + j) % 2); 3public static IEnumerable<char> Xor(IEnumerable<char> a, IEnumerable<char> b) => a.Zip(b, (i,j)=> (int)(char.GetNumericValue(i) + char.GetNumericValue(j)) % 2 == 0 ? '0' : '1'); 4 5//利用側 6Console.WriteLine(string.Join(", ", Xor(new[]{0,0,1,1,},new[]{0,1,1,0,}))); 7Console.WriteLine(string.Join(", ", Xor("0011","0110")));

こんな感じでZip使ったほうがいいと思うけど…

投稿2019/01/22 04:39

papinianus

総合スコア12705

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

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

Wings-12

2019/01/23 11:39 編集

ありがとうございます。 しかし、書いていただいたソースコードの出力結果が 0, 1, 0, 1 0, 1, 0, 1 となりました。(以下入力したソースコード) ``` using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CsharpPractice { class Program { //宣言 public static IEnumerable<int> Xor(IEnumerable<int> a, IEnumerable<int> b) => a.Zip(b, (i, j) => (i + j) % 2); public static IEnumerable<char> Xor(IEnumerable<char> a, IEnumerable<char> b) => a.Zip(b, (i, j) => (int)(char.GetNumericValue(i) + char.GetNumericValue(j)) % 2 == 0 ? '0' : '1'); static void Main(string[] args) { //利用側 Console.WriteLine(string.Join(", ", Xor(new[]{0,0,1,1,},new[]{0,1,1,0,}))); Console.WriteLine(string.Join(", ", Xor("0011","0110"))); Console.WriteLine(); Console.ReadKey(); } } } ``` もしよろしければ、"0101"で出力する方法を教えてい頂けるとありがたいです。 (すみません。ソースコードのフォーマットを見やすくする方法が分からなくて、 見づらくなっております...)
papinianus

2019/01/23 23:30

そのカンマはJoinが入れているので、 string.Join(", ", を string.Join("", にすれば、欲しい表示になります
Wings-12

2019/01/28 17:54

ありがとうございます。解決しました。
guest

0

何が問題なのでしょうか?

string output = new string(charAnsArray);

この部分は正しく動いていると思います。
String(Char[])

charAnsArray の値を見ると、 '1', '2', '1' になっていると思いますが、違いますか? それを "{0:0000}" の書式で出力しているので、 "0121" になっているかと思います。 (手元の結果)

投稿2019/01/20 11:21

pepperleaf

総合スコア6383

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

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

0

string.Join("", list);

配列なので、つなげて文字を作る。

投稿2019/01/20 09:13

kiichi54321

総合スコア1984

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問