2013-03-19 31 views
1

我很糟糕地嘗試編程任務。我不是在尋找「這是你如何做到這一點」,而是更多的是「我做錯了什麼?」句子資本家

我正在試圖從字符串輸入大寫每個句子的開始。例如字符串「你好,我的名字是約翰,我喜歡騎自行車。」我會修改字符串並以大寫字母返回,例如:「你好,我的名字是約翰,我喜歡騎自行車。」我的邏輯看起來有點缺陷,我很迷茫。

我到目前爲止下面。基本上我所做的只是測試表示句子結尾的標點符號。然後嘗試替換角色。還測試它是否在字符串的末尾,以便不創建IndexOutOfRange異常。雖然,這一切我已經得到:(

private string SentenceCapitalizer(string input) 
    { 
     for (int i = 0; i < input.Length; i++) 
     { 
      if (input[i] == '.' || input[i] == '!' || input[i] == '?') 
      { 
       if (!(input[i] == input.Length)) 
       {      
        input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
       }      
      } 
     } 

     return input; 

    } 

任何幫助是極大的讚賞,我剛學C#這樣最基本的幫助將是服務的,我不知道多少:第

+0

如果你有縮寫(固體)或省略號(。 ..)在你的文字? – 2013-03-19 06:39:02

回答

1

要檢查如果您當前的指數小於或等於字符串的長度,然後試圖改變指數2進一步沿着

if (!(input[i] == input.Length)) 
      {      
       input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
      } 

應改爲

if (!((i + 2) >= input.Length)) 
      {      
       input.Replace(input[i + 2], char.ToUpper(input[i + 2])); 
      } 

這將檢查在標點符號後面有2個值。也可以使用> =而不是==,因爲你跳躍2,你可能會超過數組的長度,==仍然返回false,但是沒有索引。

+0

哦,好的謝謝。超出範圍的例外消失了。而且它不像預期的那樣工作,我想回到繪圖板。 – 2013-03-19 06:25:14

3

而不是

if (!(input[i + 2] >= input.Length)) 

應該

if (!(i + 2 >= input.Length)) 

你是比較指數,而不是字符

1

字符串是不可變的,你不能這樣做:

var str = "123"; 
str.Replace('1', '2'); 

你哈已經做:

var str = "123"; 
str = str.Replace('1', '2'); 
0

好了,別人都爲您提供了一些指針停止明顯的錯誤,但我會盡力給你如何最好地實現這個的一些想法。

值得一思考這作爲3步驟的過程

  1. Tokenize串入句子
  2. 確保每個令牌的第一個字符是大寫
  3. 通過接合令牌重構串回到一起

(1)我會留下你的想象,但想法是結束與一個字符串數組與每個元素代表一個「s entence」根據您的要求

(2)是幾乎一樣簡單

// Upercase character 0, and join it to everything from character 1 onwards 
var fixedToken = token[0].ToUpper(CultureInfo.CurrentCulture) 
           + token.Substring(1); 

(3)也簡單

// reconstruct string by joining all tokens with a space 
var reconstructed = String.Join(" ",tokens);