Omezení vstupu C++

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
amd.21
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. led 2006
Bydliště: Ostrava

Omezení vstupu C++

Příspěvek od amd.21 »

Zdravím, zajímalo by mě, jestli jde nějak jednoduše udělat "omezení" vstupu v C++, potřebuju aby mi vstup žral pouze 0-9 a A-J a ostatní znaky nějak zahazoval nebo ignoroval(vstup se ukládá do pole char). Asi by se dala napsat nějaká šílená podmínka, která by porovnávala prvky v poli s ASCII tabulkou, ale nejde to nějak jednodušeji ?
Díky za pomoc.
NZXT H440 White, Intel i7-5820k 4.3GHz @ 1.18V, Noctua NH-C14S, ASUS X99-A, Corsair Vengeance LPX 16GB (4x4GB) DDR4 2400 CL14, MSI GTX 1060 GAMING X 6G, Samsung SSD 970 Pro 512GB, Crucial M4 250GB, Samsung 840 EVO 250GB, Western Digital Green 3TB, Corsair RM650, Samsung C34F791-WQ
Caderom
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. pro 2005
Bydliště: Beroun

Re: Omezení vstupu C++

Příspěvek od Caderom »

Kód: Vybrat vše

if((vstup[i]>='0' && vstup[i]<='9') || (vstup[i]>='A' && vstup[i]<='J')) {
  vystup[j++]=vstup[i];
}
amd.21
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. led 2006
Bydliště: Ostrava

Re: Omezení vstupu C++

Příspěvek od amd.21 »

To jsem taky zkoušel, ale nějak mi to nechce fungovat ...

Kód: Vybrat vše

for(short int i = 0;i<pocet;i++)
		{
			if((cislo[i]<='0' && cislo[i]>='9') || (cislo[i]<='A' && cislo[i]>='J'))
			{
				cout << cislo[i] << " neni platny znak !\n";
				cislo[i] = 0;
			}
		}
takhle to mám, ale pouští to všechny znaky a když obrátím nerovnosti (tak jak jsi to měl) tak mi to zas nepustí žádný znak.
NZXT H440 White, Intel i7-5820k 4.3GHz @ 1.18V, Noctua NH-C14S, ASUS X99-A, Corsair Vengeance LPX 16GB (4x4GB) DDR4 2400 CL14, MSI GTX 1060 GAMING X 6G, Samsung SSD 970 Pro 512GB, Crucial M4 250GB, Samsung 840 EVO 250GB, Western Digital Green 3TB, Corsair RM650, Samsung C34F791-WQ
Caderom
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. pro 2005
Bydliště: Beroun

Re: Omezení vstupu C++

Příspěvek od Caderom »

Já testuji na platný vstup, ty chceš testovat na neplatný. V tom případě musíš ale otočit celý logický výraz, tzn. nahradit spojující || za &&.

Kód: Vybrat vše

for(short int i = 0;i<pocet;i++)
		{
			if((cislo[i]<='0' && cislo[i]>='9') && (cislo[i]<='A' && cislo[i]>='J'))
			{
				cout << cislo[i] << " neni platny znak !\n";
				cislo[i] = 0;
			}
		}
Problém je, že v původním kódu ti např. číslice 0-9 jsou v první závorce správně vyhodnoceny, že podmínku nesplňují, ale dál se pokračuje přes || a v druhé závorce již platí, že '0'-'9' <= 'A'. V opačném pořadí závorek výrazu to pak platí i pro písmena 'A'-'J'.
amd.21
Začátečník
Začátečník
Uživatelský avatar
Registrován: 01. led 2006
Bydliště: Ostrava

Re: Omezení vstupu C++

Příspěvek od amd.21 »

Zkusil jsem, i přesto mi to např. znak W "pustí" dál,vyřešil jsem to takhle:

Kód: Vybrat vše

for(short int i = 0;i<pocet;i++)
		{
			if(cislo[i]>='0' && cislo[i]<='9')
				continue;
			else if(cislo[i]>='A' && cislo[i]<='J')
				continue;
			else
			{
				cout << cislo[i] << " neni platny znak !\n";
			}

		}
NZXT H440 White, Intel i7-5820k 4.3GHz @ 1.18V, Noctua NH-C14S, ASUS X99-A, Corsair Vengeance LPX 16GB (4x4GB) DDR4 2400 CL14, MSI GTX 1060 GAMING X 6G, Samsung SSD 970 Pro 512GB, Crucial M4 250GB, Samsung 840 EVO 250GB, Western Digital Green 3TB, Corsair RM650, Samsung C34F791-WQ
Caderom
Začátečník
Začátečník
Uživatelský avatar
Registrován: 03. pro 2005
Bydliště: Beroun

Re: Omezení vstupu C++

Příspěvek od Caderom »

Jo, to by snad taky mělo chodit. Omlouvám se, myšlenka byla správná, provedení nedotažené, když otočit logický výraz, tak opravdu celý. Tedy mi scházelo nahradit ještě && za ||. Doufám, že takhle by už to mohlo chodit:

Kód: Vybrat vše

for(short int i = 0;i<pocet;i++)
		{
			if((cislo[i]<='0' || cislo[i]>='9') && (cislo[i]<='A' || cislo[i]>='J'))
			{
				cout << cislo[i] << " neni platny znak !\n";
				cislo[i] = 0;
			}
		}
// EDIT: No a nebo šlo jednoduše původní podmínku znegovat :-)

Kód: Vybrat vše

if( ! ((vstup[i]>='0' && vstup[i]<='9') || (vstup[i]>='A' && vstup[i]<='J')) ) {
  cout << vstup[i] << " neni platny znak !\n";
}
Odpovědět

Zpět na „Programování a web“