Riadok zakonecny ciarkou C++

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Riadok zakonecny ciarkou C++

Príspevok od používateľa marek788 »

Ahojte, potreboval by som radu ako by som si mohol poradit s jednou vecou. Citam nejaky subor po riadkoch, a potrebujem aby ked bola na riadku posledna ciarka, popripade este za nou medzery aby mi to hodilo false. Vedeli by ste mi niekto poradit ako na to? Dik.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa pcsiete »

Kód: Vybrať všetko

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

bool isCommaTerminated(string s) {
	int i = s.length();
	do {
		i--;
		
		if(!isspace(s[i]))
			if(s[i]==',')
				return true;
			else 
				return false;
	} while(i>0);
}
Toto ti vráti true keď tebou povedané podmienky platia, v kóde to už len zneguješ. Ako parameter by to malo preberať riadok (kvôli podmienke isspace, pretože aj isspace('\n')==true).

Rýchlejšie:

Kód: Vybrať všetko

bool isCommaTerminated(string s) {
	const char * str = s.c_str();
	int i = s.length();
	while(str[--i]==' ') //prejde optimalizáciou
		;
	
	if(str[i]==',')
		return true;
	else 
		return false;
}
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa marek788 »

Dakujem velmi pekne za odpoved, no nejak mi nefunguje ani prva varianta ani druha (druha hlasi error) Vracia mi to false aj keby to malo byt true. Proste mam v stringu ulozene napr

Kód: Vybrať všetko

modra, cervena, fialova,      
toto je false

Kód: Vybrať všetko

modra, cervena, fialova
toto je true

A takto to davam do kodu

Kód: Vybrať všetko

if(!isCommaTerminated(string))
                return false;
Kde by mohol byt problem? Nikde tam chybu v tej prvej variante nevidim.
Dik este raz.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa pcsiete »

V druhej variante som mal chybu v typoch, už je to správne. Ale v práci tej funkcie problém nie je. Tá funkcia vráti true vtedy, keď sa riadok končí na čiarku, a false ak nie. Ty berieš výstup už po negácii, preto to máš naopak. Vždy sa orientuj podľa mena funkcie: jeZakončenéČiarkou?
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa marek788 »

Super dakujem velmi pekne, funguje to :) A mal by som este jednu otazocku. Ako by sa dalo spravit, ak by som dostal subor, ktory je uplne prazdny ale ma tam nejake medzery aby to vratilo true? S uplne prazdnym suborom problem nemam, tam vraciam true, no ak su tam uz medzery dava mi to false, a neviem na to prist ako to kontrolovat. Dakujem este raz.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa pcsiete »

Je tam viacero možností.

Kód: Vybrať všetko

bool isSpaceLine(string s) {
	int i = 0;
	while(isspace(s[i]))
		i++;
	
	return s.length()==i;
}

Kód: Vybrať všetko

//s optimalizáciou
bool isSpaceLine(string s) {
	int i = 0;
	const char * str = s.c_str();
	while(str[i]==' ')
		i++;
	
	return s.length()==i;
}
Optimalizované funkcie majú inak veľký vplyv na výkon, ale záleží na tom, či chceš preskakovať aj prázdne riadky a tabulátory. (Kompilátor musí mať zapnutú optimalizáciu (často na istej úrovni), aby si pocítil rozdiel) .

Upravená predošlá funkcia:

Kód: Vybrať všetko

bool isCommaTerminated(string s) {
	int i = s.length();
	while(i>0 && isspace(s[--i]))
		;
	
	if(s[i]!=',')
		return false;
   
   return true;
}
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Riadok zakonecny ciarkou C++

Príspevok od používateľa marek788 »

Dakujem velmi pekne :)
Napísať odpoveď