[ EmmaR @ 13.01.2013. 22:16 ] @
Treba uneti neki string-niz odjednom kao obican string, nesto poput
Citat:
1a25b3+7
i zatim iz toga napraviti prave nizove: jedan koji bi se sastojao od brojeva a drugi od preostalih znakova. Hm, to nije problem... Problem je u tome sto iz (npr)
Citat:
1a25b3+7
, rezultujuci brojcani niz treba da se sastoji od clanova:
Citat:
1, 25, 3, 7
, tj. susedne cifre treba da se spajaju u jedan broj.
strcat() odbija da prihvati promenljiv drugi argument, isto kao i strcpy. Radi
Code:
strcat( string1, string2);
ali ne i
Code:
strcat(string1, string2[i]);

Kako dodeliti vrednost oblika nesto nekom clanu drugog niza i / ili prosiriti neki string za odredjeni znak (znak po znak)?
Kako konvertovati string / char u broj? Isti problem: ne prihvata
Code:
atoi(string[i])


P.S. Znam kako to sve da uradim tamo gde postoje pravi stringovi i pravi nizovi i gde je dozvoljeno jednostavno prosirenje stringova (npr):
Code:
string3 = string1 + string2
i gde nije bitno da li se pristupa celom stringu ili odredjenom znaku iz stringa. Ali, hocu to da uradim i u C-eu. Ako je moguce.
[ 4co_R @ 13.01.2013. 23:42 ] @
Code:

#include<stdio.h>

int main(){

char str[10]="43aaakk";
int num;

num=atoi(str);
printf("%d",num);

return 0;
}

[ EmmaR @ 14.01.2013. 01:20 ] @
Citat:
4co_R
Code:

#include<stdio.h>

int main(){

char str[10]="43aaakk";
int num;

num=atoi(str);
printf("%d",num);

return 0;
}



znam za to ali ne funkcionise za deo stringa i char.


Razdvajanje sam resila:
Code (c):

#include <stdio.h>       
#include <ctype.h>       
#include <string.h>    

int main()
{

        char ulaz[50];
     char znaci[25];  //ako je broj ovde ide 0
     char brojevi[25]; // ako je znak ovde ide *
     int i = 0;

        printf("\nUnesi neki niz ");
   
     getchar();    //zbog prethodnih getchar
     
     for(i=0; i<sizeof(ulaz);i++)
     {
          ulaz[i]=getchar();
          if ( ulaz[i]=='\n' )
                {
               printf("\nKraj unosa...");
               i = sizeof(ulaz);
                }
          else
          {
               if ( isdigit( ulaz[i] ) )
               {
                    brojevi[i]=ulaz[i];
                               znaci[i]='0';
               }
               else
               {
                    znaci[i]=ulaz[i];
                               brojevi[i]='*';
               }
        }

     }
   
     printf("... Originalni niz znakova : \t %s \n", ulaz);
     printf("... Znakovi : \t\t %s \n", znaci);
     printf("... Brojevi : \t\t %s \n", brojevi);
}
 


Ostaje problem kako "oziveti" brojeve: tj. treba mi pravi niz brojeva.

P.S. U editoru nije ovako "pijan" kod.
[ 4co_R @ 14.01.2013. 02:32 ] @
Mislim da je tvoj pristup ovom problemu pogrešan.

Ovo je neko moje "brzo" rešenje...nažalost nemam trenutno vremena da se više pozabavim ovim.

Code:


#include<stdio.h>

int main(){

char str[50]="absfct18547shdgfsd1sdgmsjd8sdgs7";
int num,i,n[50],k=0;;

for (i=0;i<50;i++){
if(isdigit(str[i]) && !isdigit(str[i-1]) ){
n[k]=atoi(&str[i]);
k++;
}

}
for (i=0;i<k;i++){
printf("n=%d\n",n[i]);
}
return 0;
}

[ EmmaR @ 14.01.2013. 20:05 ] @
Citat:
4co_R: Mislim da je tvoj pristup ovom problemu pogrešan.

Ovo je neko moje "brzo" rešenje...nažalost nemam trenutno vremena da se više pozabavim ovim.

Code:


#include<stdio.h>

int main(){

char str[50]="absfct18547shdgfsd1sdgmsjd8sdgs7";
int num,i,n[50],k=0;;

for (i=0;i<50;i++){
if(isdigit(str[i]) && !isdigit(str[i-1]) ){
n[k]=atoi(&str[i]);
k++;
}

}
for (i=0;i<k;i++){
printf("n=%d\n",n[i]);
}
return 0;
}



Aha, pogresna pretpostavka da ce i cifre da cita znak po znak i da ce trebati da se spajaju da bi cinili broj, izmedju ostalog.

To je to: tvoje "brzo" resenje je resilo problem. Hvala.

Postoji li neka funkcija koja izracunava duzinu niza (nesto poput strlen za stringove)?
[ djoka_l @ 14.01.2013. 20:23 ] @
Ema, rešenje koje je stavio 4co_R nije dobro.

U prvoj for petlji, u prvoj iteraciji za i=0 testira str[0] i str[-1], što je vrlo gruba greška.
Drugo, za tebe, početnika, korišćenje funkcije atoi nije dobro. Trebalo je sama da napišeš rutinu za parsiranje nizova cifara. Rešenje sa atoi je dobro ako je zadatak dat u delu udžbenika gde se obražuju bibliotečke rutine za konverziju, a nije u ovom delu gde je cilj bio da napraviš jednostavan program za parsiranje ulaznog stringa.

Ne postoji funkcija koja računa dužinu niza. Niz karaktera je specifičan po tome što je TERMINIRAN karakterom '\0', tj. bajtom sa vrednošću 0. Kod nizova celih brojeva, na primer, nula je jedna od mogućih vrednosti, pa se ne može koristiti kao terminator.
[ djoka_l @ 14.01.2013. 20:35 ] @
Što se to tiče tvog prvog posta:
Code (c):

strcat(string1, string2[i]);
 

ne može da uradi to što ti želiš jer funkcija zahteva da njeni argumenti budu tipa char* (pokazivač na char), a kod tebe je drugi argument tipa char.
da bi funkcija radila potrebno je napisati:
Code (c):

strcat(string1, &string2[i]);
 

ili (riskantno, treba izbegavati pointersku aritmetiku, osim ako tačno znaš šta radiš):
Code (c):

strcat(string1, string2+i);
 

ali u oba slučaja se dešava ono što ne želiš, a to je da se stringu jedan doda sadržaj stringa2 počevši od i-te pozicije, pa do kraja stringa 2. To nije ono što si želela da postigneš, a to je da dodaš tačno jedan karakter i to i-ti. To se postiže funkcijom strncat:
Code (c):

strncat(string1, &string2[i], 1);
 
[ Nedeljko @ 14.01.2013. 21:28 ] @
Evo tačnog rešenja:
Code (c):

#include <ctype.h>
#include <stdio.h>

int main()
{
    char unos[20];
    int brojevi[20];
    int brojac = 0;
    int broj = 0;
    int nadjena_cifra = 0;
    int i;

    fgets(unos, sizeof(unos), stdin);

    for (i = 0; i < sizeof(unos); ++i) {
        if (isdigit(unos[i])) {
            broj *= 10;
            broj += unos[i] - '0';
            nadjena_cifra = 1;
        } else {
            if (nadjena_cifra) {
                brojevi[brojac] = broj;
                ++brojac;
                broj = 0;
                nadjena_cifra = 0;
            }

            if (unos[i] == 0) {
                break;
            }
        }
    }

    for (i = 0; i < brojac; ++i) {
        printf("%d\n", brojevi[i]);
    }

    return 0;
}
[ EmmaR @ 15.01.2013. 14:50 ] @
Citat:
Nedeljko: Evo tačnog rešenja:
Code (c):

#include <ctype.h>
#include <stdio.h>

int main()
{
    char unos[20];
    int brojevi[20];
    int brojac = 0;
    int broj = 0;
    int nadjena_cifra = 0;
    int i;

    fgets(unos, sizeof(unos), stdin);

    for (i = 0; i < sizeof(unos); ++i) {
        if (isdigit(unos[i])) {
            broj *= 10;
            broj += unos[i] - '0';
            nadjena_cifra = 1;
        } else {
            if (nadjena_cifra) {
                brojevi[brojac] = broj;
                ++brojac;
                broj = 0;
                nadjena_cifra = 0;
            }

            if (unos[i] == 0) {
                break;
            }
        }
    }

    for (i = 0; i < brojac; ++i) {
        printf("%d\n", brojevi[i]);
    }

    return 0;
}


Radi za brojeve, ali trebaju mi i znakovi (ne znam gde da u ovom kodu ubacim i to).

Idealno bi bilo da na kraju postoji jedan mesovit niz koji bi se sastojao i od stringova i od brojeva:
abc25sd1fg5 -> a, b, c, 25, s, d, 1, f, g, 5

Cilj je uneti neku racunski izraz i izracunati ga: 2+3*2 -> 8 zato su mi bitni i znakovi.
[ llux @ 15.01.2013. 15:31 ] @
Kalkulator koji izbaci rezultat tek nakon unosa svih brojeva i operacija je dobra mozgalica za ucenje programiranja. Daj sve od sebe da sama resis ako ti nije zurba.
[ EmmaR @ 15.01.2013. 15:46 ] @
Resen problem za znakove (problem je bio u pogresnom formatu kontrolne stampe, tacnije u jednom jedinom slovu).

Citat:
llux: Kalkulator koji izbaci rezultat tek nakon unosa svih brojeva i operacija je dobra mozgalica za ucenje programiranja. Daj sve od sebe da sama resis ako ti nije zurba.


Nigde ne zurim ali uveliko sanjam nizove.

Cekajte dok dodjem do zagrada.
[ Nedeljko @ 15.01.2013. 22:51 ] @
Što ne reče odmah šta ti treba? Pa, to se uopšte ne radi tako.
[ EmmaR @ 16.01.2013. 14:30 ] @
Citat:
Nedeljko: Što ne reče odmah šta ti treba? Pa, to se uopšte ne radi tako.


Kako? (smernice)
[ Nedeljko @ 16.01.2013. 18:44 ] @
Hajde da pokušam da napišem skicu kako bi to što si zamislila moglo da se produži. Prvo definiši strukturu koja sadrži jedan znak, jedan broj i informaciju da li predstavlja znak ili broj. Onda napravi niz takvih objekata popunjen kako treba, a to je ovo što si pitala. Može se moj program prepraviti. Zatim računaj vrednost izraza na sledeći način:

1. Zameni sve brojeve omeđene zagradama samim brojevima bez zagrada.
2. Ako je u koraku 1 bilo zamena, pređi na korak 1.
3. Zameni sve delove oblika "+x" i "-x", gde je "x" broj i kojima ne prethodi desna zagrada ili broj rezultatom.
4. Ako je u koraku 3 bilo zamena, pređi na korak 1.
5. Pronađi prvi zdesna znak "^" i proveri da li je omeđen brojevima. Ako jeste, zameni ga rezultatom. Prvi zdesna ne znači samo prvi od kraja, nego i prvi zdesna od neke desne zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
6. Pronađi prvi od znakova "*" i "/" sleva i proveri da li je omeđen brojevima. Ako jeste, zameni ga rezultatom. Prvi sleva ne znači samo prvi od početka, nego i prvi sleva od neke leve zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
7. Pronađi prvi od znakova "+" i "-" i proveri da li je omeđen brojevima. Prvi sleva ne znači samo prvi od početka, nego i prvi sleva od neke leve zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
8. Poslednji član niza je broj koji je rezultat.

Inače se ovo ne radi tako, već postoji elegantnije rešenje bez pravljenja dodatnih nizova.
[ EmmaR @ 17.01.2013. 20:23 ] @
Citat:
Nedeljko: Hajde da pokušam da napišem skicu kako bi to što si zamislila moglo da se produži. Prvo definiši strukturu koja sadrži jedan znak, jedan broj i informaciju da li predstavlja znak ili broj. Onda napravi niz takvih objekata popunjen kako treba, a to je ovo što si pitala. Može se moj program prepraviti. Zatim računaj vrednost izraza na sledeći način:

1. Zameni sve brojeve omeđene zagradama samim brojevima bez zagrada.
2. Ako je u koraku 1 bilo zamena, pređi na korak 1.
3. Zameni sve delove oblika "+x" i "-x", gde je "x" broj i kojima ne prethodi desna zagrada ili broj rezultatom.
4. Ako je u koraku 3 bilo zamena, pređi na korak 1.
5. Pronađi prvi zdesna znak "^" i proveri da li je omeđen brojevima. Ako jeste, zameni ga rezultatom. Prvi zdesna ne znači samo prvi od kraja, nego i prvi zdesna od neke desne zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
6. Pronađi prvi od znakova "*" i "/" sleva i proveri da li je omeđen brojevima. Ako jeste, zameni ga rezultatom. Prvi sleva ne znači samo prvi od početka, nego i prvi sleva od neke leve zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
7. Pronađi prvi od znakova "+" i "-" i proveri da li je omeđen brojevima. Prvi sleva ne znači samo prvi od početka, nego i prvi sleva od neke leve zagrade. Treba izvršiti sve takve zamene, pa ako je učinjena barem jedna, preći na korak 1.
8. Poslednji član niza je broj koji je rezultat.

Inače se ovo ne radi tako, već postoji elegantnije rešenje bez pravljenja dodatnih nizova.


Tako sam i ja nesto smislila: eliminisem prvo zagrade (sa svim onim sta se nalaze unutar njih) a onda slobodne * i / i na kraju + i - (stepenovanje nije bilo predvidjeno).

Citat:
Inače se ovo ne radi tako, već postoji elegantnije rešenje bez pravljenja dodatnih nizova


Hocu i ja jedan niz, ali kako da string prihvati stringove kao parametre: { "12","+","5","*","3",... } kada string u C i ne postoji (to je samo NIZ znakova, a cak ni niz nije bas niz)?
[ Nedeljko @ 29.01.2013. 01:36 ] @
Kako ide?
[ EmmaR @ 14.03.2013. 20:33 ] @
Citat:
Nedeljko: Kako ide?


Tek sada videh ovo pitanje. Nikako, "projekat" privremeno obustavljen... iz subjektivno-objektivnih razloga.
Ja sam ti od onih koji znaju dan-noć da provedu rešavajući neki problem a kada iza toga stoji znanje nalik na švajcarski sir (sa primedbom da ima više rupa nego sira), to na kraju postane opasno po zdravlje.
Uglavnom, zaglavih se na aritmetičke prioritete ... i if i switch ... ništa. A još nije probano ni sa zagradama? (ova "problematika" razmatrana u VB, samo zbog početnog nejasnog problema oko nepostojanja stringa kao stringa u C, pa sam razbila na dva dela; a VB ima onaj tip variant koji trpi sve)
Ideja I: Obraditi prvo * i /, a zatim raditi sa + -. ovo sam pokušala na kraju sa switch (case slučajevi su znaci - operatori), pa dok god ima * ili / da obrađuje okolne brojeve, a kada stigne do kraja da se resetuje (brojač na 0, početak) a onda da krene redom, ... Međutim, nikako da propadne dalje od dva case (prihvati recimo * +, ali ako "zakomplikujem" pa ubacim još jedan dodatni znak / ili -, ne propada.
Ideja II: Ispitati znak pa ako je + ili -, ispitati naredni znak i u odnosu na njega preduzeti neku radnju u zavisnosti od prioriteta. Ovo je bilo nešto uspešnije, s tim što nikako nisam uspevala da ga nateram da obradi i poslednji znak.
Ideja III. Napraviti "mali milion pomoćnih nizova": prvo množiti, pa od toga napraviti niz, onda deliti, pa na kraju sabirati i oduzimati. A zagrade: da li je otvorena, da li je zatvorena, šta je unutra (ima li dodatnih zagrada), šta je ispred, šta je iza...?


Nego, javih se jer otkrih "toplu vodu":

Code (c):


//ovo kompajlirati sa opcijom: -std=c99  LINUX
//gcc -std=c99 fajl.c
//izvrsno ./a.out

#include <stdio.h>
#include <string.h>

int  main()
{
     //string kao niz?
     char * dani[]={"Ponedeljak","Utorak","Sreda","Cetvrtak","Petak","Subota","Nedelja","\0"};
     int duzina=0;
     

     while( dani[duzina]!="\0" )
     {
          duzina++; //racuna duzinu "string niza", ne prihvata strlen(dani)          
     }
     
     printf("\nSledi spisak dana u sedmici\n-----------------\n");
     for(int i=0; i<duzina;i++)
     {
          printf("%s\n",dani[i]);
     }

     return 0;
}

 


string kao niz... konačno...

nego, koliko je ovo opšte prihvaćeno? I, šta tačno predstavlja parametar: -std=c99?
[ 4co_R @ 15.03.2013. 00:26 ] @
Code:
 int i=0; 
u okviru for petlje je dozvoljeno u c99 standardu.

"string kao niz... konačno..."

Nije string kao niz nego niz stringova...

[Ovu poruku je menjao 4co_R dana 15.03.2013. u 02:53 GMT+1]
[ EmmaR @ 15.03.2013. 15:52 ] @
Citat:
4co_R
Code:
 int i=0; 
u okviru for petlje je dozvoljeno u c99 standardu.


A ja mislila da je vezno za:
Code:
char * dani[]={"Ponedeljak","Utorak","Sreda","Cetvrtak","Petak","Subota","Nedelja","\0"};


Citat:

"string kao niz... konačno..."

Nije string kao niz nego niz stringova...


na to sam mislila, samo pobrkah red reci.


[ Nedeljko @ 15.03.2013. 16:50 ] @
Ovo nikada nemoj da radiš
Code (c):

dani[duzina] != "\0"
 

Ovde se porede pokazivači, a ne stringovi. Ako je kompajler bukvalnu vrednost "\0" koja se pojavljuje u izvornom kodu na dva mesta zapamtio u binarnom kodu na dva mesta, onda će poređenje to dvoje dati rezultat da je različito. Dakle, može biti "\0" != "\0". Umesto toga koristi
Code (c):

strcmp(dani[duzina], "\0") != 0
 

[ Nedeljko @ 15.03.2013. 18:41 ] @
Može ovako
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", 0};
    int i = 0;

    printf("Tha days of week are:\n");

    while (days[i] != 0) {
        printf("\t%s\n", days[i]);
        ++i;
    }

    return EXIT_SUCCESS;
}
 
[ EmmaR @ 16.03.2013. 16:26 ] @
Citat:
Nedeljko: Može ovako
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", 0};
    int i = 0;

    printf("Tha days of week are:\n");

    while (days[i] != 0) {
        printf("\t%s\n", days[i]);
        ++i;
    }

    return EXIT_SUCCESS;
}
 


Taman htedoh da pitam, šta staviti kao poslednji član ovakvog niza, pa videh ovo. Pretpostavljam, da može i nešto drugo sem nule, jer nula može i da zatreba ? (samo ne: \0)
[ Nedeljko @ 16.03.2013. 16:32 ] @
Može i ovako
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    int i;

    printf("Tha days of week are:\n");

    for (i = 0; i < sizeof(days)/sizeof(const char*); ++i) {
        printf("\t%s\n", days[i]);
    }

    return EXIT_SUCCESS;
}
 
[ EmmaR @ 16.03.2013. 22:10 ] @
Citat:
Nedeljko: Može i ovako
Code (c):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    int i;

    printf("Tha days of week are:\n");

    for (i = 0; i < sizeof(days)/sizeof(const char*); ++i) {
        printf("\t%s\n", days[i]);
    }

    return EXIT_SUCCESS;
}
 


Ovo je mnogo bolje.
Zaboravih na sizeof, koja zna da bude nerealna. sizeof(days)/sizeof(const char*) je zbog toga da izračuna pravu dužinu niza ?

Još jedno pojašnjenje:
return EXIT_SUCCESS - znam da predstavlja da vraća uspešno obrađen kod, ima li još nešto ? "Nezavisnost" od povratnog tipa funkcije? (kako ide za neuspelo?)
[ djoka_l @ 16.03.2013. 23:08 ] @
Citat:
Taman htedoh da pitam, šta staviti kao poslednji član ovakvog niza, pa videh ovo. Pretpostavljam, da može i nešto drugo sem nule, jer nula može i da zatreba ? (samo ne: \0)


Nula ne može da zatreba, jer ovo je niz pointera, a nula je NULL pointer koji ne može ništa drugo da znači osim nedefinisanog pointera.

Citat:
Još jedno pojašnjenje:
return EXIT_SUCCESS - znam da predstavlja da vraća uspešno obrađen kod, ima li još nešto ? "Nezavisnost" od povratnog tipa funkcije? (kako ide za neuspelo?)


EXIT_SUCCESS ima vrednost 0. Sve druge izlazne vrednosti main funkcije su greške, a ne postoji konvencija koja vrednost predstavlja koju grešku - to zavisi od programa do programa...
[ djoka_l @ 16.03.2013. 23:34 ] @
EmmaR, Nedeljko ti je napisao da to što hoćeš da postigneš treba da se radi na drugačiji način i u tome je potpuno u pravu.

Batrgaš se sa stringovima, a želiš da uradiš nešto što zahteva neke tehnike koje ti nisu poznate (izgleda).

Nemoj da se mučiš i da na neprimerenom zadatku vežbaš rad sa stringovima. Predlažem ti da za vežbu uradiš sledeći program:

Učitati sa ulaza liniju teksta. Reči u tekstu ispisati u obrnutom redosledu. Uzeti da su reči međusobno odvojene jednom ili više belina. Beline su znaci ' ' (razmak - space) i '\t' (horizontalni tabulator).

Primer:
ULAZ: C je lak
IZLAZ: lak je C

Kao pomoć, pretpostaviti da broj reči u ulaznom stringu nije veći od 30.
[ Nedeljko @ 17.03.2013. 00:25 ] @
Citat:
EmmaR: Zaboravih na sizeof, koja zna da bude nerealna.

U kom smislu nerealna?
[ EmmaR @ 17.03.2013. 12:59 ] @
Citat:
Nedeljko: U kom smislu nerealna?

U smislu da pokazuje više nego što zaista ima članova: U navedenom primeru, dužina niza (dani u sedmici) rezultat je 28 a treba da bude 7. (sad ukapirah 7*4, prikazuje broj zauzetih bajtova).
Citat:

Učitati sa ulaza liniju teksta. Reči u tekstu ispisati u obrnutom redosledu. Uzeti da su reči međusobno odvojene jednom ili više belina. Beline su znaci ' ' (razmak - space) i '\t' (horizontalni tabulator).
Primer:
ULAZ: C je lak
IZLAZ: lak je C
Kao pomoć, pretpostaviti da broj reči u ulaznom stringu nije veći od 30.


OK, probaću. Do sada sam okretala samo numeričke nizove, znak po znak, tj. broj po broj.

[ Nedeljko @ 17.03.2013. 20:11 ] @
Upravo tako, sizeof prikazuje broj zauzetih bajtova.
[ EmmaR @ 17.03.2013. 23:59 ] @
Djoka, u onom tvom primeru me muče tabulatori. Sve je OK dok postoji blank bar sa jedne strane tabulatora (\t), ali ako je kompletno okružen znakovima, dobijaju se zanimljivi rezultati:

Code (c):

#include <stdio.h>
#include <string.h>


int  main()
{
     char slova[] = "Ana voli Milovana, \ta \tJeca voli Pecu";
     char temp;
     int i, d, j, k=0, poc = 0;
     
     printf("\n Pre okretanja - string: %s",slova);
     
     d=strlen(slova);
     for(i=0;i<d/2;i++)
     {
          temp = slova[i];
          slova[i] = slova[(d-1-i)];
          slova[(d-1-i)] = temp;
     }
     printf("\nPosle okretanja - string: %s\n",slova);
         
     printf("\nduzina niza %d\n",d);
     for(i=0;i<d;i++)
     {
          if( slova[i] != ' ' )
          {
               if (slova[i] == '\t')
               {
                    continue; //ovo i nema neki efekat
               }
               
               //duzina reci
               poc=i;
               printf(" ...ulaz i=%d",i);
               while( slova[i] != ' ' && i<d )
               {                   
                    i++;
               }
               
               //okretanje reci
               for(j=poc,k=(i-1);j<k;j++,k--)
               {
                    temp = slova[j];
                    slova[j] = slova[k];
                    slova[k] = temp;
               }             
               
          }
          else
          {              
               continue;
          }    

     }
         
     
     printf("\nPosle okretanja reci - string: %s\n",slova);
     for(i=0;i<d;i++) printf("%2d: %c\n",i,slova[i]);

     return 0;
}
 
[ EmmaR @ 18.03.2013. 00:38 ] @
nasla sam isspace() umesto ispitivanja da li je prazno polje ili tabulator
[ djoka_l @ 18.03.2013. 09:54 ] @
EmmR, ovo je najčudniji C kod koji sam ikada video, koji, nekim čudom, ipak radi. Ipak tvoj tok razmišljanja je otišao u potpuno drugom pravcu od očekivanog. Ja sam očekivao da napraviš niz stringova, nađeš pojedinačne reči koje redom kopiraš u taj niz i na kraju ispišeš reči sadržane u stringovima u obrnutom redusledu.

Takođe sam se nadao da ćeš, dok to radiš, malo da prouči string biblioteku i nađeš strtok funkciju. Sama po sebi, strtok nije naročito interesantna, ali sam hteo da ti uvedem pojam TOKENIZACIJE (razdvajanje ulaznog niza karaktera u tokene, što ti treba za tvoj projekat kalkulatora).

Evo mog rekurzivnog rešenja sa strtok.
Code (c):

#include <stdio.h>
#include <string.h>

#define DELIMITERS " \t"

void WriteRev( char* str ){
  char *strpart;

  if( (strpart=strtok( str, DELIMITERS )) == NULL ) return;

  WriteRev( NULL );
  printf("%s ", strpart);

  return;

}

int main () {
   char Ulaz[] = "String   za testiranje        obrtanja reci";

   printf("ULAZ: %s\n", Ulaz);
   printf("IZLAZ: ");
   WriteRev(Ulaz);
   printf("\n");

}
 
[ EmmaR @ 18.03.2013. 13:15 ] @
Citat:
djoka_l: EmmR, ovo je najčudniji C kod koji sam ikada video, koji, nekim čudom, ipak radi. Ipak tvoj tok razmišljanja je otišao u potpuno drugom pravcu od očekivanog. Ja sam očekivao da napraviš niz stringova, nađeš pojedinačne reči koje redom kopiraš u taj niz i na kraju ispišeš reči sadržane u stringovima u obrnutom redusledu.

Takođe sam se nadao da ćeš, dok to radiš, malo da prouči string biblioteku i nađeš strtok funkciju. Sama po sebi, strtok nije naročito interesantna, ali sam hteo da ti uvedem pojam TOKENIZACIJE (razdvajanje ulaznog niza karaktera u tokene, što ti treba za tvoj projekat kalkulatora).

Evo mog rekurzivnog rešenja sa strtok.
Code (c):

#include <stdio.h>
#include <string.h>

#define DELIMITERS " \t"

void WriteRev( char* str ){
  char *strpart;

  if( (strpart=strtok( str, DELIMITERS )) == NULL ) return;

  WriteRev( NULL );
  printf("%s ", strpart);

  return;

}

int main () {
   char Ulaz[] = "String   za testiranje        obrtanja reci";

   printf("ULAZ: %s\n", Ulaz);
   printf("IZLAZ: ");
   WriteRev(Ulaz);
   printf("\n");

}
 


Mora da radi: moj kod je klasičan analogni časovnik na vrhu katedrale (sa sve zupčanincima i klatnima), a tvoj je kvarcni sat.
Prva ideja i jeste bila da prebacim u niz stringova, ali opet kod bi bio nešto između analognog i kvarcnog sata (ne bi sve bilo urađeno u dve linije). Tu se nešto zapetljah (nešto oko tipova podataka).
Znam kako funkcionišu rekurzivne funkcije (teoretski), ali ja se tu uglavnom spetljam. Može pojašnjenje? Zašto WriteRev( NULL );?
Ako ti je cilj bio i da se zadrže originalni razmaci, ovaj tvoj primer ne radi.
[ djoka_l @ 18.03.2013. 13:24 ] @
Kod strtok funkcije se PRVI put upotrebi pokazivač na string, a posle toga se šalje NULL.

Program radi tako što u
if( (strpart=strtok( str, DELIMITERS )) == NULL )
dodeli strpart varijabli pokazivač na prvi token u ostatku linije, zatim pozove ponovo sebe , pa na kraju ispiše prvi token.

Svaki poziv funkcije WriteRev "otkida" po jednu reč iz ulaznog niza, pa sa tako skraćenim ulaznim nizom otkida sledeću reč.

Nije bio cilj zadatka da se sačuvaju razmaci, samo da se ispišu, na neki način, reči (nizovi ne-blank simbola) iz ulaznog niza koji sadrži reči razdvojene sa jednim ili više blank simbola.
[ Nedeljko @ 18.03.2013. 16:31 ] @
Mislim da je samo zbinjuješ sa tom funkcijom. EmmaR, uradi sa niyom stringova. To je najprirodnije rešenje. Ne kažem da tvoje ne radi, ali ćeš morati da znaš klasične stvari na klasičan način.
[ djoka_l @ 19.03.2013. 12:57 ] @
EmmaR, ovakav sam program očekivao da vidim:

Code (c):

#include <stdio.h>
#define Boolean int
#define true 1
#define false 0

int main() {
   char* wordarr[100];          // Niz pointera na stringove
   char  c;                     // Slovo na trenutnoj poziciji
   int   NumW=0, i;             // Broj nadjenih reci
   Boolean ExpectingWord = true;// Stanje automata
   char* TestStr=" jedan  \t dva  \t\t tri   \tcetiri\t";

   while( c = *TestStr ) { /* Vrti se dok ne nadjes '\0' */
   if( ExpectingWord )  // Ako ocekujem rec, onda preskacem praznine
      switch( c ) {
         case ' '  :
         case '\t' : break;
         // Ako sam stigao ovde, pamtim poziciju, pa trazim prazninu ili kraj
         default   : {ExpectingWord=false; wordarr[NumW++]=TestStr;}
      }
   else  // Trazim prvu prazninu, zamenjujem je terminatorom stringa
      switch( c ) {
         case ' '  :
         case '\t' : {ExpectingWord=true; *TestStr = '\0';}
      }
   TestStr++;
   }
   for( i=NumW-1; i>=0; i--) printf("%s ", wordarr[i]);
   printf("\n");
}