2014-02-14 2 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.

Say вход: Dude. dude.

Если текущий символ является первым ., то newParagraph в конце итерации:

Dude. D___ 

где _ указывает символы еще не заполнены.

Но, в следующих четырех итерациях, мы не находим .. Таким образом, вы копируете данные из input в newParagraph, тем самым переписывая изменения.

Dude. dude. 

EDIT:

Ваш код пытается преобразовать первый символ каждого предложения в верхний регистр. Вот как это должно быть изменено:

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 и приращение I в петле for, i переходит к следующему:

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

Но на этот раз итерация выполняет код в else.

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

Это изменяет newParagraph[i] который D к paragraph[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; 
    } 
} 
Смежные вопросы