[ azzpoz @ 11.01.2013. 10:40 ] @
Kako da uspijem ograničiti unos karaktera u niz (po 1 karakter)?

Code:

for (int i = 0; i < 20; i++)
{
   cin >> niz[i];   // niz i u zagradama
   if (niz[i+1] != 0) /* provjera da li je uneseno u niz[0] više karaktera, jer ako ih je više svrstavaju se autom. u sljedeće nizove,
                                                                                 a to ne želim */
   {
      cout << VISE od 1 karaktera"; // moja zamisao, ali ne funkcioniše?!
      i--;
   }
}



[Ovu poruku je menjao Mihajlo Cvetanović dana 11.01.2013. u 12:51 GMT+1]

[Ovu poruku je menjao azzpoz dana 11.01.2013. u 13:52 GMT+1]

[Ovu poruku je menjao azzpoz dana 11.01.2013. u 14:01 GMT+1]

[Ovu poruku je menjao azzpoz dana 11.01.2013. u 14:01 GMT+1]
[ Mihajlo Cvetanović @ 11.01.2013. 11:55 ] @
Šta je tačno "niz", i kakva mu je svrha ovde? Zašto se element "niza" niz[i+1] ispituje u trenutku kada još nije ni inicijalizovan? Zašto se promenljiva "i" dekrementira?

Daj nam primer inputa, i outputa koji odgovara datom inputu.
[ azzpoz @ 11.01.2013. 12:50 ] @
Niz je vel 20.
int niz[20]; // greška -> char na mjestu int
Pomoću "for" petlje ponavlja se program od 0 do 19 i tako upisujem karaktere sa cin>>niz;

Interesuje me da li mogu ograničiti unos na smo jedan karakter(znak), jer ja kada upišem "aeiou"= a se svrsta u niz[0], e u niz[1], i u niz[2], itd.

Želio bih omoguciti samo unos jedne znamenke!!!



INPUT: cin>>niz[0]; cin>>niz[1]; cin>>niz[2] -> do 20;
Kada u cin>>niz[0] unesem aeiou, znakovi poslije a se autom. svrstavaju u sljedeće memorijske lokacije(indekse), a to ne želim!!!

[Ovu poruku je menjao azzpoz dana 11.01.2013. u 15:32 GMT+1]
[ Mihajlo Cvetanović @ 11.01.2013. 13:07 ] @
Ne verujem da to tako radi. Ako je "niz" tipa int[], i ti radiš cin >> niz[0] onda program pokušava da učita jedan int. Ako se programu unese "aeiou" onda program treba već kod prvog znaka ("a") da zaustavi učitavanje jer znak "a" nije int (niti je cifra 0-9, niti znak + ili -). Ako se dobro sećam niz[0] bi samo dobio vrednost 0.
[ azzpoz @ 11.01.2013. 13:18 ] @
Ako je tipa int mozemo unositi samo po jedan znak.
Meni je potrebno da ograničim tip char da u niz unosim po jedan karakter, a ne da mogu cijeli niz unijeti od jedanput.

* nadam se da me razumijete šta želim objasniti *
[ Mihajlo Cvetanović @ 11.01.2013. 13:57 ] @
Ne razumem kako u istoj rečenici imaš i "int" i "znak". Razumeo bih da govorimo o "char" i "znak", ali int predstavlja brojeve u rasponu od −2,147,483,648 do 2,147,483,647, a ne znakove.
[ azzpoz @ 11.01.2013. 14:31 ] @
char niz[20] // niz velicine 20, ali tipa char

for(int i=0; i<20; i++) cin>>niz; // za unos zmaj => niz[0]=z; niz[1]=m; niz[2]=a; niz[3]=j;
Želim omogućiti unos po jednog slova, a ako unesem više od 1 kao npr. zmaj, da se unos ponovi dok se ne unose po jedno slovo!
[ Mihajlo Cvetanović @ 11.01.2013. 14:50 ] @
Ovo se radi tako što pročitaš ceo string u nekoj privremenoj promenljivoj, i onda proveravaš taj string da li ti odgovara. Funkcija koja se koristi za čitanje stringa je getline, koja je specijalno definisana za std::string u zaglavlju <string>:

Umesto linije "cin >> niz", ili "cin >> niz[i ]" (sad već ne znam koja je od te dve) treba ti ovo:

Code:
for (;;)
{
   string temp;
   getline(cin, temp);

   if (temp.size() == 1)
   {
      niz[i] = temp[0];
      break;
   }

   cout << "Više od jednog karaktera" << endl;
}
[ X Files @ 11.01.2013. 15:01 ] @
Programski jezici C/C++ nemaju u standardnim bibliotekama ukljucene bog zna kakve mehanizme za "user friendly" unos podataka kroz konzolu. Svako taj "problem" resava na svoj nacin.

Sada je pitanje, sta konkretno zelis da postignes, da li je to skolski zadatak (didakticki oblikovan) u kome moras da upotrebis ono sto je zadato, ili mozes da se dovijas kako tebi odgovara.

Ja nikada ne bih korisnicki interfejs projektovao na nacin kako si zamislio zadatkom, ali kad bih morao, verovatno bih upotrebio neku pomocnu promenljivu:

// primer: NETESTIRANO
Code:

#include <iostream>
using namespace std;

const int VELICINA_NIZA = 20;

int main()
{
    string tmp;
    char niz[VELICINA_NIZA+1] ={0};

    for ( int i=0; i<VELICINA_NIZA; i++ )
    {
        cout << "Unesi jedno slovo: ";
        getline(cin, tmp);
        if (tmp.size() != 1)
        {
            cerr << "Uneli ste " << tmp.size() << " karaktera, ponovite upis!" << endl;
            --i;
            continue;
        }
        niz[i] = tmp[0];

    }
    cout << "Rec: " << niz;

    return 0;
}




Konacno, pogledaj funkciju kbhit(), koja u petlji ceka pritisak tastera, a kasnije taj pritisnuti karakter mozes konvertovati u sta god zelis, tj redom u karaktere "niz[]-a" koga pominjes.
Primer: http://www.elitesecurity.org/p1786975

[ X Files @ 11.01.2013. 15:02 ] @
Heh, evo Mihajlo me pretekao :)
[ azzpoz @ 11.01.2013. 16:32 ] @
Od pomoći mi je!!!

Zahvaljujem vam se do sljedećeg mog novog problema :)

[Ovu poruku je menjao azzpoz dana 11.01.2013. u 17:46 GMT+1]