Kontrola wielkości liter (Dev-C++)


(Zimon) #1

witam

jak zrobić takie coś żeby zmieniało małe litery na duże ale również po spacji jeżeli słowo jest np dwu wyrazowe

niżej umieszczam kawałek mojej bazy do szkoły:

cout<<"Podaj autora:"<

while (cin.peek()=='\n') cin.get();

cin.getline(Autor,sizeof (Autor));

Autor[0]=toupper(Autor[0]);

int i;

for(i=1;Autor_!=0;i++)_

Autor__=tolower(Autor__);

Narazie wczytuje mi dane z odstępami ale nie wiem jak zrobić żeby pierwsza literę nazwiska również zmieniało na dużą.

(henryk sienkiewicz ->Henryk sienkiewicz , a chcę żeby było

henryk sienkiewicz ->Henryk Sienkiewicz )

z góry dzięki za pomoc


(Ryan) #2

Po co Ci ta linia?

while (cin.peek()=='\n') cin.get();

Możesz zrobić to tak (kod od Autor[0] wywal):

int i;

for (i = 0; Autor[i] != '\0'; ++i)

{

  if ((i == 0) || (Autor[i - 1] == ' '))

    Autor[i] = toupper(Autor[i]);

  else

    Autor[i] = tolower(Autor[i]);

}

Gdyby ktoś miał wątpliwości: Autor[i-1] nie spowoduje błędu adresowania (nie zaadresuje Autor[-1] dla i == 0) ponieważ spełniony będzie pierwszy z warunków (i == 0) i kod dla drugiego z nich nie będzie w ogóle wywoływany. Innymi słowy dla i == 0 if skończy się na porównaniu i do zera, później testowane będą oba warunki (i będzie większe od zera i indeksowanie będzie poprawne). W razie obaw alternatywa:

int i;

if (Autor[0] != '\0')

{

  Autor[0] = toupper(Autor[0]);

  for (i = 1; Autor[i] != '\0'; ++i)

  {

    if (Autor[i - 1] == ' ')

      Autor[i] = toupper(Autor[i]);

    else

      Autor[i] = tolower(Autor[i]);

  }

}

Dlaczego potrzebny jest if przed for? Żeby nie wyskoczyć z bufora dla ciągu pustego.


(Zimon) #3

dzięki wielkie

o to mi chodziło:D