2014-02-14 81 views
1
char capSentStart(char paragraph[], char newParagraph[]) 
{ 
    for(int i = 0; i < 301; ++i) 
    { 
     if(paragraph[i] == '.' && paragraph[i + 1] == ' ') 
     { 
      newParagraph[i] = '.'; 
      newParagraph[i + 1] = ' '; 
      newParagraph[i + 2] = ' '; 
      newParagraph[i + 3] = toupper(paragraph[i + 2]); 
      ++i; 
     } 
     else 
     { 
      newParagraph[i] = paragraph[i]; 
     } 
    } 
} 

如果你輸入說「段落」夥計。花花公子。花花公子。花花公子。 然後cout < < newParagraph; 它打印沒有任何更改的同一段落。「如果」語句沒有返回正確的信息。

+1

小心索引和界限.. – Maroun

+3

學會使用調試器,它將幫助您找到像這樣的問題的解決方案。 –

+1

當它遇到一個句點時確實會改變'newParagraph'。但是你需要考慮它在循環的*次*迭代中的作用。 – jogojapan

回答

0

在if語句的真實情況下,您正在填充newParagraph,但是當您繼續使用時,您會在if語句的假情況下再次覆蓋它們。段落和新段落應該有兩個循環變量。

爲了給你更詳細的答案,你應該告訴我們期待的輸出。

2

根據你的代碼,如果當前字符是".",那麼你在if condition內部做了你想做的。考慮當前字符不是"."的情況。您只是複製原來的段落,替換newParagraph中的前幾個字符。

說輸入:Dude. dude.

噹噹前字符是所述第一.,所述newParagraph在迭代結束時是:

Dude. D___ 

其中_指示字符尚未被填充。

但是,在接下來的四次迭代中,我們沒有找到.。因此,您正在將數據從input複製到newParagraph,從而覆蓋更改。

Dude. dude. 

編輯:

你的代碼試圖每一句的第一個字符轉換爲大寫。下面是它應該如何進行修改:

char capSentStart(char paragraph[], char newParagraph[]) 
{ 
    int new_paragraph_idx=0; 
    for(int i = 0; i < 301; ++i) 
    { 
     if(paragraph[i] == '.' && paragraph[i + 1] == ' ') 
     { 
      newParagraph[new_paragraph_idx++] = '.'; 
      newParagraph[new_paragraph_idx++] = ' '; 
      newParagraph[new_paragraph_idx++] = ' '; 
      newParagraph[new_paragraph_idx++] = toupper(paragraph[i + 2]); 
      ++i; 
     } 
     else 
     { 
      newParagraph[new_paragraph_idx++] = paragraph[i]; 
     } 
    } 
} 

將一個new_ptr實際上分別填充newParagraph,從而防止過度書寫。並且照顧琴絃的邊界。否則,您可能會以SIGSEGV

+0

命名整數索引'new_ptr'是相當具有誤導性的,因爲它畢竟不是指針。 –

+0

@ArneMertz感謝您指出。更新了答案:) – nitish712

+0

不錯。 +1的好解釋:-) –

0

結束您總是根據索引i編寫。即使您在newParagraph的較高索引中撰寫,以後的迭代也會覆蓋完成的內容。

0

使用下列內容:

char capSentStart(char paragraph[], char newParagraph[]) 
{ 

    for(int i = 0,j = 0; i < 301; ++i,++j) 
    { 
     if(paragraph[i] == '.' && paragraph[i + 1] == ' ') 
     { 
      newParagraph[j] = '.'; 
      newParagraph[j + 1] = ' '; 
      newParagraph[j + 2] = ' '; 
      newParagraph[j + 3] = toupper(paragraph[i + 2]); 
      j=j+3; 
      i=i+2; 
     } 
     else 
     { 
      newParagraph[j] = paragraph[i]; 
     } 
    } 
} 
0

執行第一次迭代中if(paragraph[i] == '.' && paragraph[i + 1] == ' '),得到:

  paragraph[i] = '.' 
        ^
    paragraph = "Dude. dude. ..." 
newParagraph = "Dude. D   " 

++i後,我在for循環增量,i移動到以下幾點:

  paragraph[i] = 'd' 
        ^
    paragraph = "Dude. dude. ..." 
newParagraph = "Dude. D   " 

但是這一次迭代執行else中的代碼。

else 
{ 
    newParagraph[i] = paragraph[i]; 
} 

這改變了newParagraph[i]Dparagraph[i],這是d

  paragraph[i] = 'd' 
        ^
    paragraph = "Dude. dude. ..." 
newParagraph = "Dude. d   " //'D' is changed back to 'd' 

然後,newParagraph剛剛被覆蓋到paragraph

0
char capSentStart(char paragraph[], char newParagraph[]) 
{ 
    int index=0; 

    for(int i = 0; i < 301; ++i) 
    { 
     index=i; 
     if(paragraph[i] == '.' && paragraph[i + 1] == ' ') 
     { 
      newParagraph[i] = '.'; 
      newParagraph[i + 1] = ' '; 
      newParagraph[i + 2] = ' '; 
      newParagraph[i + 3] = toupper(paragraph[i + 2]); 
      index=i+3; 
     } 
     else 
     { 
      newParagraph[i] = paragraph[i]; 
     } 
     i=index; 
    } 
}