2017-03-27 17 views
0

最初に私は初心者のために非常に簡単な質問のために申し訳ありませんが、私は文字列の入力を受け取り、新しい文字列でそれを逆にするプログラムを書こうとしています両方の文字列が、それは回文であるよりも、同じである場合はタイプ変換のエラー

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 

    namespace Assg2_question1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       string word, reverse =""; 
       Console.WriteLine("type any word to check if it palindrome or not"); 
       word = Console.ReadLine(); 
       int lengthOfWord, i; 
       lengthOfWord = word.Length; 
       for(i=lengthOfWord ; i>=1 ; i--) 
       { 
        reverse = word[lengthOfWord]; 
       } 
      } 
     } 
    } 

私は2つの文字列の単語を持っていると私はそれが逆=単語[lengthOfWord]でエラーを示した文字列を逆にしようとすると、逆に...比較することができます。は、暗黙的に型charをstringに変換できません。それはなぜですか?私は自分のプログラムでcharを使うことはないから

+0

'reverse'は文字列変数ですが、word [lengthOfword]は単語文字列の特定のインデックスに文字を返します。したがって、ここではcharからstringへの変換はできません。それがエラーの原因です。 –

+0

charを使用します。あなたの単語[lengthOfWord]はcharである単一の文字を返します。それをより良く見るには、 'char letter = word [lengthOfWord]; reverse = letter.ToString() ' – FCin

+0

[文字列を逆転させるための最良の方法]の複写が可能です(http://stackoverflow.com/questions/228038/best-way-to-reverse-a-string) – ASh

答えて

2

StringBuilderが必要です。また、あなたの配列の境界チェックがここで混乱していました。配列のインデックスは0から始まり、word.Length - 1は最後のインデックスです:

string word , reverse = ""; 
Console.WriteLine("type any word to check if it palindrome or not"); 
word = Console.ReadLine(); 
int lengthOfWord, j; 
StringBuilder sb = new StringBuilder(); 
lengthOfWord = word.Length - 1; 
for (j = lengthOfWord; j >= 0; j--) 
{ 
    sb.Append(word[j]); 
} 
reverse = sb.ToString(); 

word[j]がcharではなく文字列であるため、あなたがエラーを得ました。また、StringBuilderを使用すると文字列が不変になります。

+2

適切なC#の答え、歓声を見てうまく:) – Qrchack

+0

OPは正しいインデックスを使用していないことを指摘する価値があるかもしれない '私は'単語の文字をインデックスに '。 –

+0

ありがとう、私は以前知らなかったことを学んだ "stringbuilder – faizan

0

あなたの可変ワードはStringです。 StringCharの配列です。配列なので、[index]を使ってアクセスすることができます。それはあなたがやっていることです。したがって、word[lengthOfWord]を使用すると、Charが得られます。 Charは暗黙的にStringとして変換されません。

しかし、Stringを予約するときは、ロジックがまったく正しくありません。

+0

逆=逆+単語[lengthOfWord]; – faizan

+0

私は前のキャラクターを保持するためにドライランの後でこれを編集しましたが、今度はエラーIndexが配列の境界の外にあることを示しています。 – faizan

+0

"' word [lengthOfWord] 'を使用すると、実際にはそうしないと、境界外の例外が発生します。 OPが正しいインデックス「i」を使用していないことを指摘する価値があります。 –

0

使う文字列ビルダ:

static void Main(string[] args) 
    { 
     string word = string.Empty; 
     string reverse = string.Empty; 
     Console.WriteLine("type any word to check if it palindrome or not"); 
     word = Console.ReadLine(); 
     var sb = new StringBuilder(); 
     for (var i = word.Length - 1; i >= 0; i--) 
     { 
      var ch = word[i]; 
      sb.Append(word[i]); 
     } 
     reverse = sb.ToString(); 
     Console.WriteLine(word); 
     Console.WriteLine(reverse); 
     Console.ReadKey(); 
    } 
1

あなたはまた、LINQを使用して文字列を逆にすることができます:

var reverse = new string(word.ToCharArray().Reverse().ToArray()); 

ループのためのあなたのものであれば、これは動作します:

var reverse = ""; 
for (int i = word.Length - 1; i >= 0; i--) 
{ 
    reverse += word[i]; 
} 

コードの違いに注意してください:
reverse = word[lengthOfWord]reverse += word[i]
前者は最後の文字をそれぞれ割り当て、後者は文字列にそれぞれの別の文字を追加します。

しかし、その場合には

は、StringBuilderのを使用すると、より効率的である:文字列は不変オブジェクトであるためです

var sb = new System.Text.StringBuilder(); 
for (int i = word.Length - 1; i >= 0; i--) 
{ 
    sb.Append(word[i]); 
} 
var reverse = sb.ToString(); 

。したがって、文字列の内容が変更されると、実際にはメモリ内に新しい文字列が割り当てられます。それがループのようにたくさん行われたときはあまり効率的ではありません。
しかし、StringBuilderを使用することによって、オブジェクトの内容は、各繰り返しごとに新しいメモリを割り当てることなく変更できます。

+0

なぜ私たちは全長で-1を行っているのですか? – faizan

+0

ああ、私はそれを得ました、インデックスは0から1から始まらず、 – faizan

+0

@faizan確かにCの遺産生きる – LukStorms

関連する問題