2015-03-14 3 views
0

У меня есть проблема с выводом текста в символы кода предложения. Когда я подскажу: heLLo! Здравствуйте. я в порядке.случай предложения указателя (C)

Ожидаемый результат: Здравствуйте! Здравствуйте. Я в порядке.

Но мой результат вывода пробега: Здравствуйте! Здравствуйте. я в порядке.

Мой код не может выводить в верхнем регистре после '!' /'''/ '?'/'_' Любой может сообщить, какую ошибку я сделал? Заранее спасибо.

-Ellie код

Пример:

printf ("\n\nThe line of the text in sentence case is:\n"); 

i = 0; 
text_ptr = text; 
up = 1;     /* up = 1 means upper case is yes */ 
while (*(text_ptr+i) != '\0') /* could have been: while(text[i]) */ 
{ 
    if(!up) 
     if(*(text_ptr+i-1)==' ' && toupper(*(text_ptr+i)=='I' && (*(text_ptr+i+1)==' ' || 
       *(text_ptr+i+1)=='.' || *(text_ptr+i+1)=='!' || *(text_ptr+i+1))=='?')) 
     up = 1;  /* capitalize i if all alone */ 

    if(up) 
     if (*(text_ptr+i)!=' ' || *(text_ptr+i+1)=='.' || *(text_ptr+i+1)=='!' || *(text_ptr+i+1)=='?') 
     { 
      putchar(toupper(*(text_ptr++))); 
      up = 0; 
     } /* end if */ 
     else 
      putchar(tolower(*(text_ptr++))); 
    else 
    { 
     putchar(tolower(*(text_ptr+i))); 
     if (*(text_ptr)=='?' || *(text_ptr)=='.' || *(text_ptr)=='!') 
      up = 1; 
     i++; 
    } /* end else */ 
}/* end while */` 
+2

Вы пытались отладить это самостоятельно? Если нет, вы можете прочитать это: http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – alk

+0

'i' используется неверно. Это не кажется необходимым. – BLUEPIXY

+0

Примечания: 1) используйте несколько '{braces}' для многострочных блоков. 2) используйте указатель вместо обозначения указателя. 3) рассмотрим конечный автомат - подход. – wildplasser

ответ

0

Еще раз. После главной роли немного больше в коде я увидел, что

  • вы манипулировали указатель text_ptr++
  • инкрементируется i только в else части петли
  • печататься text_ptr++ и text_ptr+i

.. что трудно понять Итак, я полностью пересмотрел свою версию:

int i = 0; 
int up = 1; /* up = 1 means next char should be upper case*/ 
char* text_ptr = text; 

while (*(text_ptr+i) != '\0') { /* could have been: while(text[i]) */ 
    if(!up) 
     if(*(text_ptr+i-1)==' ' && toupper(*(text_ptr+i))=='I' && 
     (*(text_ptr+i+1)==' ' || *(text_ptr+i+1)=='.' || // fix bracket here 
     *(text_ptr+i+1)=='!' || *(text_ptr+i+1)=='?')) { // "i" foll. by one of those  
      up = 1; /* capitalize i if all alone */ 
     } 

    if(up) 
     if (*(text_ptr+i)!=' ' && *(text_ptr+i)!='.' && // fix here 
      *(text_ptr+i)!='!' && *(text_ptr+i)!='?') { // anything else than these 
      putchar(toupper(*(text_ptr+i))); // toupper and reset up 
      up = 0; 
     } /* end if */ 
     else 
      putchar(tolower(*(text_ptr+i))); // just print 
    else 
    { 
     putchar(tolower(*(text_ptr+i))); 
     if (*(text_ptr+i)=='?' || *(text_ptr+i)=='.' || *(text_ptr+i)=='!') 
      up = 1; 
    } /* end else */ 
    i++; 
}/* end while */ 

Обратите внимание, что эта версия требует снова toupper. В противном случае будет снижен I. Ваш четвертый if отлично работает (я наблюдал за тем, чтобы вы не сбросили флаг up для пробелов).

+0

спасибо за ваш ответ. Я просто редактирую свой код в соответствии с вашим предложением. Выход по-прежнему не так, как я ожидал. Станьте: Здравствуйте! Здравствуйте. Е хорошо. Я использую: toupper (* (text_ptr + i) == 'I', потому что хочу вывести i, чтобы стать I. Я действительно запутался сейчас. – EllieFebr

+0

См. Обновление выше - теперь он работает (проверьте http: // codepad.org/ZLGhTms4) – Trinimon

+0

Одна небольшая ошибка - переместите одну скобку в соответствии с редактированием (снова 'toupper') ... http://codepad.org/1eZsrKaZ – Trinimon