2017-03-27 110 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]; 
       } 
      } 
     } 
    } 

我有兩個串字和反向,當我嘗試扭轉它顯示了字符串上反向錯誤=字[lengthOfWord];不能將char類型隱式轉換爲字符串,爲什麼?因爲我從來沒有在我的程序中使用字符

+0

'reverse'是一個字符串變量,而'word [lengthOfword]'返回字符串中特定索引處的字符。所以這裏從char到string的轉換是不可能的。這就是錯誤所在。 –

+0

你使用char。你的單詞[lengthOfWord]返回單個字符,它是一個字符。爲了更好地看到它,你可以做'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]是一個字符,而不是一個字符串。字符串也是不可變的,最好使用StringBuilder。

+2

很高興看到一個合適的C#答案,歡呼聲:) – Qrchack

+0

可能值得指出的是,OP沒有使用正確的索引'i'來索引'word'中的字符。 –

+0

謝謝大家,我學到了我以前不知道的東西「stringbuilder – faizan

0

您的變量字是String。並且StringChar陣列。因爲它是一個數組,你可以通過[index]來訪問它,這就是你正在做的事情。所以當你使用word[lengthOfWord]時,你會得到一個CharChar不能隱式轉換爲String

但是,當你想保留一個String你的邏輯是不正確的。

+0

reverse = reverse + word [lengthOfWord]; – faizan

+0

我編輯了這個幹運行後,以保存前一個字符,但現在它顯示錯誤索引超出數組的界限。 – 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()); 

如果一個for循環是你的事,那麼這將工作:

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