getline() zamiast getchar() - zamiana małych liter na duże i na odwrót

0

Witam.
Mam takie pytanko.
W jaki sposób przerobić poniższy kod?
Użytkownik gdy wpisze jedno słowo, to litery zamieniają się z małych na duże a duże na małe.
Ale jak użytkownik wpisze kilka słów ze spacjami, to ostatnia litera każdego słowa dubluje się i zastępuje spację.
Wie ktoś jak temu zapobiec?
A oto kod mojego programu z getchar():

//biblioteki(dyrektywy):
#include<cmath>
#include<conio.h>//pozwala wywołać funkcję getch();
#include<cstdio>
#include<cstdlib>//pozwala wywołać system("pause");
#include<fstream>
#include<iostream>//pozwala pisać za pomocą cout<<"";//obsługa strumieni I/O
#include<iomanip>
#include<locale>
#include<math.h>
#include<sstream>
#include<stdio.h>//standardowa obsługa wejscia/wyjscia
#include<stdlib.h>
#include<string>
#include<time.h>
#include<windows.h>
#include<cwctype>
#include<cwchar>
#include<clocale>
using namespace std;
int main(){
	static int i;
	int a;
	char tablica[a];
	i=0;
	cout<<"Podaj imie: ";
	for(a=0; ; a++){
		tablica[a]=getchar();
		i++;
		if(tablica[a]=='\n'){
			break;
		}
	}
	for(a=0; a<i-1 ; ++a){
		int b;
		if(tablica[a]>64 && tablica[a]<91){
			tablica[b]=tablica[a]+32;
		}
		else if(tablica[a]>96 && tablica[a]<123){
			tablica[b]=tablica[a]-32;
		}
		cout<<tablica[b];
	}
	
    system("PAUSE");
    return 0;
}

Nie wiem czy dobrze wytłumaczyłem o co mi chodzi, ale jeśli będzie trzeba to później przetłumacze jakoś.

Gdzieś coś mi świta że trzeba by zastosować metody length czy coś podobnego ale nie jestem pewien.
P.S. słyszałem, że jest funkcja zamiany małych liter na duże i na odwrót, ale chciałem samemu to zrobić, więc proszę o nie pisanie, że przecież jest taka i taka funkcja od tego...

0

Z twojego postu wynika że chcesz żeby twój program zamieniał małe litery na wielkie i wielkie na małe, czy tak?
Jak tak to:

 #include <iostream>
#include <cctype>
using namespace std;
void change_letters(string &text)
{
	for(int i = 0; i<text.length(); i++)
	{
		if(isupper(text[i]))
				text[i] = tolower(text[i]);
		else if (islower(text[i]))
				text[i] = toupper(text[i]);
	}
}
int main(void)
{
	string text;
	cout<<"Enter text\n";
	getline(cin, text);
	change_letters(text);
	cout<<text;
	return 0;
}

O nagłówkach poczytaj w swoim poprzednim temacie http://4programmers.net/Forum/Newbie/148519-wypisanie_na_wyjsciu_elementu_ciagu_fibonacciego_o_indeksie_n

0

Nic nowego, ale krócej :P

#include <iostream>
#include <cctype>
#include <string>
using namespace std;
void change_letters(string &text){
    for(char &c : text)
        c = islower(c) ? toupper(c) : tolower(c);
}
int main(){
    string text;
    cout<<"Enter text";
    getline(cin, text);
    change_letters(text);
    cout<<text;
    return 0;
}
0

Hmmm

 ch.cpp: In function 'void change_letters(std::string&)':
ch.cpp:5:19: error: range-based 'for' loops are not allowed in C++98 mode

Przynajmniej na razie lepiej nie mieszać mu z C++ 11.

0

Ale ze mnie głąb. Wystarczyło dodać w odpowiednim miejscu

if(tablica[a]==32){
			cout<<tablica[a];
		}
0
spartanPAGE napisał(a):

Nic nowego, ale krócej :P

#include <iostream>
#include <cctype>
using namespace std;
void change_letters(string &text){
    for(char &c : text)
        c = islower(c) ? toupper(c) : tolower(c);
}
int main(){
    string text;
    cout<<"Enter text";
    getline(cin, text);
    change_letters(text);
    cout<<text;
    return 0;
}

Brzydko, można lepiej i krócej:

std::transform(text.begin(), text.end(), [](char c) {return islower(c) ? toupper(c) : tolower(c);});

jeśli ma być bez C++11 to wystarczy napisać własną funkcyjkę swap_case, która przyjmuje literę i zwraca jej zamiennik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1