[ tuzlaorg @ 18.07.2001. 17:45 ] @
Ovo je radilo u C++-u:
int bar;
system("echo foo " bar " times.");
Ali to ne radi u C-u? jesam li upravu?
[ Vojislav Milunovic @ 18.07.2001. 18:19 ] @
hmmm ne znam kako mislis da ne radi. (posto forum izbaci \ predpostavljam da je \ bilo idpred " koje okruzuju bar.
Drugim recima ovaj program bi trebalo samo da uradi ovo:
Code:

#echo foo "bar" times
foo bar times
#


Uzgred uvek napisi sta ocekujes program da radi.Ja predpostavljam da treba samo da ostampa ovaj string na ekran.

// edit filmil: zatvoren code tag

[Ovu poruku je menjao filmil dana 16.11.2004. u 22:44 GMT+1]
[ tuzlaorg @ 18.07.2001. 23:06 ] @
Okej;
Ovaj kod bi trebo da ispise integer u systemu
int bar;
bar=0;
system("echo times" bar " times ");

a rezultat bi bio (makar u C++u je)
echo times 0 times
:(
[ Vojislav Milunovic @ 18.07.2001. 23:17 ] @
Nema sanse da je ovako nesto radilo sa C++.Jednostavno ovo nije sintaksa C/C++ jezika.Da bi nesto ovako radilo moras sa strcat ili sprintf da napravis prvo string "echo foo 0 times".
[ tuzlaorg @ 19.07.2001. 06:30 ] @
a kako ;
:)
bil moglo ako stavis
#define fool da radi?
kod mene je radilo
pazi na www.xtcnet.net/~tuzlaorg/ugcounter1.2.1
[ Vojislav Milunovic @ 19.07.2001. 11:10 ] @
Nemozes tako da ubacujes broj u string tipa :

"bvlalaldasda" broj "dfsdasdadasdada";

Moras sa sprintf i ili strcat to da sredis
[ slash @ 19.07.2001. 12:06 ] @
Citat:
predator je napisao:
Nemozes tako da ubacujes broj u string tipa :

"bvlalaldasda" broj "dfsdasdadasdada";

Moras sa sprintf i ili strcat to da sredis


int broj;
broj = 0;
char *buf;
snprintf (buffer, sizeof(buffer), "blablabla %d blablabla", broj);
system(buffer);

[ slash @ 19.07.2001. 12:06 ] @
Citat:
predator je napisao:
Nemozes tako da ubacujes broj u string tipa :

"bvlalaldasda" broj "dfsdasdadasdada";

Moras sa sprintf i ili strcat to da sredis


int broj;
broj = 0;
char *buffer;
snprintf (buffer, sizeof(buffer), "blablabla %d blablabla", broj);
system(buffer);

[ kajla @ 19.07.2001. 13:24 ] @
Citat:
tuzlaorg je napisao:
a kako ;
:)
bil moglo ako stavis
#define fool da radi?
kod mene je radilo
pazi na www.xtcnet.net/~tuzlaorg/ugcounter1.2.1


Pazi ovaku u C-u je ok ako napises "Milorad" " je kajla" to ti je isto kao "Milorad je kajla", ili
#define NAME "Milorad"

pa sad:
NAME " je kajla". to je sasvim OK (znaci napises dva konstantna niza karaktera jedan do drugog) ali ne moze "fdfdfd" varijabla "fdfdf", posebno sto je tebi varijabla tip-a int, tako da moras da je konvertojes sa sprintf() ili itoa().

poz.
[ kajla @ 19.07.2001. 13:33 ] @
Citat:
slash je napisao:
Citat:
predator je napisao:
Nemozes tako da ubacujes broj u string tipa :

"bvlalaldasda" broj "dfsdasdadasdada";

Moras sa sprintf i ili strcat to da sredis


int broj;
broj = 0;
char *buffer;
snprintf (buffer, sizeof(buffer), "blablabla %d blablabla", broj);
system(buffer);



Pa nisi alocirao memoriju za buffer! sizeof (buffer) ti je 4.

poz.
[ slash @ 19.07.2001. 13:37 ] @
Citat:
kajla je napisao:
Citat:
slash je napisao:
Citat:
predator je napisao:
Nemozes tako da ubacujes broj u string tipa :

"bvlalaldasda" broj "dfsdasdadasdada";

Moras sa sprintf i ili strcat to da sredis


int broj;
broj = 0;
char *buffer;
snprintf (buffer, sizeof(buffer), "blablabla %d blablabla", broj);
system(buffer);



Pa nisi alocirao memoriju za buffer! sizeof (buffer) ti je 4.

poz.



oprosti, zurio sam se :) Hvala na ispravci !
[ tuzlaorg @ 20.07.2001. 07:08 ] @
LOL, pitanje je bilo sta je sa :) system; ne treba mi sprintf :)
Hvala :)
[ kajla @ 20.07.2001. 11:05 ] @
Citat:
tuzlaorg je napisao:
LOL, pitanje je bilo sta je sa :) system; ne treba mi sprintf :)
Hvala :)


Pa onda je odgovor: NEMOZE SAMO SA system(), mozes koristiti strcat() i strcpy().

poz.
[ tuzlaorg @ 21.07.2001. 02:26 ] @
Ma ne, nego svi odjednom pocese prepravljati jedne druge. Uradio sam vec to i uskoro cu da ga posaljem na server. Moram da instaliram debiana na dva servera u kuci pa kad to sredim javicu se :) sa linkom do .c soruca
[ overdose @ 16.11.2004. 15:02 ] @
Code:

#include <stdio.h>
#include <string.h>
#define N 15

void main () {
  
  int bar;
  printf ("Unesite ceo broj: "); scanf("%d", &bar);
  char komanda1[] = "echo foo ";
  char komanda2[] = " times";
  char komanda3[N];
  sprintf (komanda3, "%d", bar);
  
  strcat (komanda1, komanda3);
  strcat (komanda1, komanda2); 

  
  printf ("\n\033[1;32mtuzlaorg:\033[0m Testiramo da li smo dobili potreban string: "
          "\033[41m\033[1;37m %s \033[0m\n         Sad izvrsavamo tu komandu:\n\n", komanda1);
  
  system (komanda1);
}


Funkcija system očekuje da joj se preda string. To može biti direktno navedeni string ("blah, blah") ili "pravi" string koji je formiran u tom programu (onda se navodi bez navodnika). Kod u tvojoj prvoj poruci nije dobar jer "bar" ne postoji kao string u programu.

Funkcija strcat nadovezuje string na string. Ovde nam je još potrebna funkcija sprintf koja u ovom slučaju vrši konverziju integer-a u char i stavlja ga u string komanda3 (dakle pravi string od integer-a).

Evo jednog praktičnog programčića koji koristi ovo.

Kada treba da se prevede program test.c na unix-u i da se dobije izvršni fajl test treba kucati:

cc test.c -o test

Hvala bogu pa postoji program make koji kada se pokrene (a ne postoji Makefile) radi upravo ovo. Ali zamislimo da on ne postoji. Alias se ne može napraviti jer svaki put prevodimo program koji se drugačije zove ! Evo koda koji radi ovo:

Code:

/* prevedi.c */

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

void main (int bpar, const char *vpar[]) {

  char komanda1[] = "cc ";
  char komanda2[] = ".c -o ";
  
  strcat (komanda1, vpar[1]);
  strcat (komanda1, komanda2); 
  strcat (komanda1, vpar[1]);
  
  printf ("\n\033[1;32mprevedi:\033[0m Testiramo da li smo dobili potreban string: "
          "\033[41m\033[1;37m %s \033[0m\n         Sad izvrsavamo tu komandu:\n\n", komanda1);
  
  system (komanda1);
}


Sada ako pokrenemo program:

./prevedi test

dobićemo izvršni program test.

Ovde ima samo jedna misteriozna stvar ! Naime, ako je ime c fajla duže od 3 karaktera doći će do segmentation fault-a, ali će i dalje program da odradi posao. Tek kad završi sve onda pukne. Nejasno mi je zašto ?

OvEr
[ yooyo @ 16.11.2004. 16:12 ] @
Ja cim vidim coveka znam da li zna da radi sa pointerima :)

Code:

  char komanda1[] = "cc ";
  char komanda2[] = ".c -o ";

  strcat (komanda1, vpar[1]);
  strcat (komanda1, komanda2); 
  strcat (komanda1, vpar[1]);


Za komanda1 je alocirano 4 bajta ("cc "\0). strcat dodaje na kraj od komanda1 vpar[1] i na taj nacin bombardujes memoriju.

Uradi ovako:
Code:

char temp[1024]; // mora biti dovoljno veliko
sprintf(temp, "%s%s%s%s", komanda1, vpar[1], komanda2, vpar[1]);
system(temp);


yooyo
[ overdose @ 16.11.2004. 17:56 ] @
Aha, hvala yooyo !

Mnogo je bolje rešenje sa sprintf.

Zanimaju me još 2 stvari.

1. Zašto onda ovaj kod ima isti problem:

Code:

  char komanda1[1024] = "cc ";
  char komanda2[] = ".c -o ";

  strcat (komanda1, vpar[1]);
  strcat (komanda1, komanda2); 
  strcat (komanda1, vpar[1]);


Kao i zašto se isti problem ne javlja u prvom programu (tuzlaorg problem) ?

2.
Citat:
yooyo: Ja cim vidim coveka znam da li zna da radi sa pointerima :)