Omezení vstupu C++
- amd.21
- Začátečník

- Registrován: 01. led 2006
- Bydliště: Ostrava
Omezení vstupu C++
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.
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

- Registrován: 03. pro 2005
- Bydliště: Beroun
Re: Omezení vstupu C++
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

- Registrován: 01. led 2006
- Bydliště: Ostrava
Re: Omezení vstupu C++
To jsem taky zkoušel, ale nějak mi to nechce fungovat ...
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.
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;
}
}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

- Registrován: 03. pro 2005
- Bydliště: Beroun
Re: Omezení vstupu C++
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 &&.
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'.
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;
}
}- amd.21
- Začátečník

- Registrován: 01. led 2006
- Bydliště: Ostrava
Re: Omezení vstupu C++
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

- Registrován: 03. pro 2005
- Bydliště: Beroun
Re: Omezení vstupu C++
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:
// EDIT: No a nebo šlo jednoduše původní podmínku znegovat
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;
}
}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";
}