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

getline() zamiast getchar() - zamiana małych liter na duże i na odwrót
adrian.widzew
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:149
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():

Kopiuj
//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...

edytowany 3x, ostatnio: adrian.widzew
spartanPAGE
Rozumiem twoje środowisko nie zapewniło Ci więcej nagłówków ;)
adrian.widzew
nagłówki spisuje wszystkie, żebym później nie szukał któryś raz z kolei, którego brakuje jak program marudzi, że brakuje dyrektywy. Tak łatwiej
spartanPAGE
Bardzo dobre podejście!</ironia>
flowCRANE
Fajna technika - dodawać wszystkie znane nagłówki nawet jak wykorzystuje się tylko kilka... o.O
JR
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:14
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:

Kopiuj
 #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

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
0

Nic nowego, ale krócej :P

Kopiuj
#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;
}
edytowany 3x, ostatnio: spartanPAGE
JR
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:14
0

Hmmm

Kopiuj
 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.

Zobacz pozostałe 3 komentarze
_13th_Dragon
Wiek miniony czas pożegnać.
JR
No super. Zainstalowałem najnowszą wersję i teraz wywala mi błąd o braku libmpc-3.dll.
_13th_Dragon
To musisz zainstalować, chyba proste, no nie? Z tym że nawet tak zaawansowany projekt (o którym mowa w tym temacie) z całą pewnością nie wymaga tego libmpc-3.dll
JR
nvm. Już naprawiłem.
Azarien
mogliby w końcu zrobić C++11 domyślnym standardem w GCC. Visual C++ ma bardzo wybiórczą obsługę standardu, ale to co jest jest dostępne od ręki, bez ustawiania żadnych parametrów.
adrian.widzew
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:149
0

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

Kopiuj
if(tablica[a]==32){
			cout<<tablica[a];
		}
Azarien
nie 32, tylko ' ', bo będziesz się kiedyś zastanawiał co to za liczba.
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:13 dni
0
spartanPAGE napisał(a):

Nic nowego, ale krócej :P

Kopiuj
#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:

Kopiuj
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.


spartanPAGE
Biadoli waść :P Krócej nie jest

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.