Toon posts:

[C] fout...

Pagina: 1
Acties:
  • 177 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
oi...
ik heb een vraagje...

ik heb deze code :
code:
1
2
3
4
5
6
7
8
9
#include <stdio.h> 
int main() 
{ 
char string[20]; 
printf("command:"); 
scanf("%s", string); 
system("%s", string); 
return 0; 
}

nu compile ik enzow, en dan run ik em "./command" maar nou geeft ie een error als ik alles heb ingevuld.
error :

root@earth:~/c# ./command
command:uptime
sh: fg: no job control
root@earth:~/c#

wat is er mis?
(met exec() werkt het ook niet)

Verwijderd

volledige path al es op gegeven?

Verwijderd

Topicstarter
jup precies dezelfde error

  • shreklich
  • Registratie: Januari 2002
  • Laatst online: 04-03-2025
Misschien moet je die "int" voor je main weghalen. Ik ben ook maar een noob hierin maar ik heb nog nooit de hoofdfunctie als een integer gedefineerd.

Verwijderd

Topicstarter
ook weer dezelfde error :'(

Verwijderd

code:
1
2
3
4
5
6
7
NAME
     system - execute a shell command

SYNOPSIS
     #include <stdlib.h>

     int system (const char * string);

kortom:
code:
1
2
3
4
5
6
7
8
9
#include <stdio.h> 
int main() 
{ 
char string[20]; 
printf("command:"); 
scanf("%s", string); 
system(string); 
return 0; 
}

Problem solved? :?

Verwijderd

Topicstarter
dank je wel...
het werkt :)
maar waarom hoef je daar nou geen %s neer te zetten hmmz is dat alleen bij printf ofzow?

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Op zaterdag 27 april 2002 17:29 schreef shreklich het volgende:
Misschien moet je die "int" voor je main weghalen. Ik ben ook maar een noob hierin maar ik heb nog nooit de hoofdfunctie als een integer gedefineerd.
maakt niet uit of je void main() of int main() gebruikt, int main() is standaard en kun je een return value specificeren, 0 als het programma goed is afgebroken en anders een andere waarde.

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zaterdag 27 april 2002 17:33 schreef TuXx het volgende:
dank je wel...
het werkt :)
maar waarom hoef je daar nou geen %s neer te zetten hmmz is dat alleen bij printf ofzow?
Euhms...
Misschien dat je de werking van beide functies es beter moet proberen te begrijpen. Printf/scanf/sprintf/etc parsen tekst naar een bepaalde output (bijv naar een string/chararray).

system wil gewoon een chararray hebben.

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 18-08 22:36
Je gebruikt de %s, %f, etc., etc. typisch als je het output format van je variabelen wilt controleren. Dit is niet wat je wilt bij het system commando. Hierbij wil je gewoon uitgevoerd hebben wat je meegeeft.
Op zaterdag 27 april 2002 17:33 schreef TuXx het volgende:
dank je wel...
het werkt :)
maar waarom hoef je daar nou geen %s neer te zetten hmmz is dat alleen bij printf ofzow?

  • PipoDeClown
  • Registratie: September 2000
  • Niet online

PipoDeClown

Izze Zimpell

Op zaterdag 27 april 2002 17:33 schreef TuXx het volgende:
dank je wel...
het werkt :)
maar waarom hoef je daar nou geen %s neer te zetten hmmz is dat alleen bij printf ofzow?
printf werk een beetje anders dat klopt.

God weet alles, want hij is lid van de Mosad. To protect your freedom i will take that away from you. Mijn drankgebruik heeft ernstig te lijden onder mijn gezondheid.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

behoefte aan een mooiere versie?
dan wil ik wel ff wat in elkaar draaien ;)

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
ok
/me weet genoeg :)

Verwijderd

Op zaterdag 27 april 2002 17:33 schreef TuXx het volgende:
dank je wel...
het werkt :)
maar waarom hoef je daar nou geen %s neer te zetten hmmz is dat alleen bij printf ofzow?
Ehh hou de output van man printf en van man system es naast elkaar..

en stel je dan die zelfde vraag nog es?

(eej mods dit is de mooiste RTFM die jullie in weken gezien hebben of wat?! >:) )

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

kan het niet laten ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//constanten (geen defines ivm typechecking)
const int nbOfCmds = 20;            

int main(int argc, char *argv[])        
{
    int  argumenten_teller;
    char     *uitvoeren[ nbOfCmds ];    

    if(argc>1)                      
    {
        for(argumenten_teller=0; argumenten_teller < argc; argumenten_teller++)
        {
            uitvoer[argumenten_teller] = argv [argumenten_teller+1]);
        }
    }
    else                             
    {
        printf("Minimaal 1 argument meegeven aan %s.\n", argv [0]);
        exit(1);                    
    }

    uitvoeren [argumenten_teller-1] = NULL;     //afsluiten met NULL ivm execvp 
    execvp( uitvoeren [0], uitvoeren);      //het uitvoeren van de commando's
    exit(1111);                  //wordt alleen uitgevoerd in geval van een error
}

untested enzo :)
maar deze kan ./programmanaam ls -a (ed) uitvoeren

Doet iets met Cloud (MS/IBM)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
No flame intended, maar je hebt er niets veel van begrepen, D2k. Jou code iets heel anders dan een aanroep van system(); lees de manual om te weten waarom. Verder laat de structuur van je programma (wat toch niet echt complex is) zeer te wensen over. Daarbij doel ik op de onduidelijke if-constructie en het afwisselende gebruik van identifiers als 'argumenten_teller' enerzijds en 'nbOfCmds' anderzijds.

Tenslotte werkte de code ook niet, aangezien je ALLE argumenten kopieert, inclusief argument 0, de naam van het huidige programma. Je programma blijft zichzelf dus recursief aanroepen tot in de eeuwigheid (of tot de procesruimte op is).

(Laat ik niet eens BEGINNEN over de positionering en plaatsing van accolades en spaties.)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Op zaterdag 27 april 2002 18:05 schreef Soultaker het volgende:
No flame intended, maar je hebt er niets veel van begrepen, D2k.
tnx :)
Jou code iets heel anders dan een aanroep van system(); lees de manual om te weten waarom.
klopt
Verder laat de structuur van je programma (wat toch niet echt complex is) zeer te wensen over. Daarbij doel ik op de onduidelijke if-constructie en het afwisselende gebruik van identifiers als 'argumenten_teller' enerzijds en 'nbOfCmds' anderzijds.
ach naampjes
Tenslotte werkte de code ook niet, aangezien je ALLE argumenten kopieert, inclusief argument 0, de naam van het huidige programma. Je programma blijft zichzelf dus recursief aanroepen tot in de eeuwigheid (of tot de procesruimte op is).
er stond toch ook untested? ik weet ook wel dat ik argv[1] >> moet hebben. Fouten zijn menselijk ;)
(Laat ik niet eens BEGINNEN over de positionering en plaatsing van accolades en spaties.)
dat heeft met topix te maken
in mijn editor ziet het er schitterend uit iig
<edit> zo beter?

Doet iets met Cloud (MS/IBM)


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Op zaterdag 27 april 2002 17:34 schreef _Mo_ het volgende:
[..]

maakt niet uit of je void main() of int main() gebruikt, int main() is standaard en kun je een return value specificeren, 0 als het programma goed is afgebroken en anders een andere waarde.
int main() is wel goed, void main() een karakter meer tikken, en je hoeft toch geen return te doen vanuit main(). Dus waarom gebruikt er ooit iemand void main() ?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • The End
  • Registratie: Maart 2000
  • Nu online

The End

!Beginning

Op zaterdag 27 april 2002 17:45 schreef D2k het volgende:
kan het niet laten ;)
code:
1
2
3
4
for(argumenten_teller=0; argumenten_teller < argc; argumenten_teller++)
{
    uitvoer[argumenten_teller] = argv [argumenten_teller+1]);
}
Dit is erug fout...
Als argc 3 is, dan wordt er gevraagd naar argv[1], argv[2] en argv[3]... Dan crashed ie (behalve als je een keer mazzel hebt :) )

Doe dan dit:
code:
1
2
3
4
for(argumenten_teller=1; argumenten_teller < argc; argumenten_teller++)
{
    uitvoer[argumenten_teller-1] = argv [argumenten_teller]);
}

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

argumenten_teller < argc

2<3 :?
probleem opgelost?

Doet iets met Cloud (MS/IBM)


  • The End
  • Registratie: Maart 2000
  • Nu online

The End

!Beginning

Op maandag 29 april 2002 10:23 schreef D2k het volgende:
argumenten_teller < argc

2<3 :?
probleem opgelost?
Ja, en daarna doe je argumenten_teller+1 dan is ie weer 3 :)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Op maandag 29 april 2002 10:25 schreef The End het volgende:

[..]

Ja, en daarna doe je argumenten_teller+1 dan is ie weer 3 :)
zal wel es testen vanaaf :)
maar volgens mij zou het moeten kloppen

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

tis mijn eer te na om dit te laten gaan ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//constanten (geen defines ivm typechecking)
const int nbOfCmds = 20;            

int main(int argc, char *argv[])        
{
    int  argumenten_teller;
    char     *uitvoeren[ nbOfCmds ];    

    if(argc>1)                      
    {
        for(argumenten_teller=0; argumenten_teller < argc; argumenten_teller++)
        {
            uitvoeren[argumenten_teller] = argv [argumenten_teller+1];
        }
    }
    else                             
    {
        printf("Minimaal 1 argument meegeven aan %s.\n", argv [0]);
        exit(1);                    
    }

    uitvoeren [argumenten_teller-1] = NULL;   //afsluiten met NULL ivm execvp 
    execvp( uitvoeren [0], uitvoeren);    //het uitvoeren van de commando's
    exit(1111);                  //wordt alleen uitgevoerd in geval van een error
}

nu tested en al :) en dit werkt parima

Doet iets met Cloud (MS/IBM)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Op maandag 29 april 2002 17:29 schreef D2k het volgende:
code:
1
2
3
4
        for(argumenten_teller=0; argumenten_teller < argc; argumenten_teller++)
        {
            uitvoeren[argumenten_teller] = argv [argumenten_teller+1];
        }
Niet naar The End luisteren, he? ;)

Denk even met me mee: wanneer argumenten_teller gelijk is aan argc-1, geldt (argumenten_teller < argc) dus wordt je for-lus doorlopen; vervolgens lees je argv[argumenten_teller + 1], oftewel argv[argc - 1 + 1], oftewel argv[argc] uit. Dat kan niet, want argv bevat argc elementen; van 0 tot argc-1 dus.

Misschien werkt het stiekum wel in jou omgeving, maar officieel werkt 't niet. Ik zou het zo doen:
code:
1
2
for(i=1;i<argc;++i)
  uitvoeren[i-1]=argv[i];

Dit gaat wel goed. (Is IMHO ook veel leesbaarder bij gebrek aan belachelijk lange tijdelijke variabelen).

  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

exit(1111) is onzin, maak daar dan
code:
1
return EXIT_FAILURE;

van.

ohja, // commentaar is alleen toegestaan in de C99 standaard, die jij vast nog niet hebt.

en system() is de meest gebruikelijke wijze van systeem commando's geven.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Op maandag 29 april 2002 17:48 schreef Soultaker het volgende:
Niet naar The End luisteren, he? ;)
zou niet durven ;) had alleen vanmorgen geen tijd het tegendeel te bewijzen :+
[theorie]
Misschien werkt het stiekum wel, maar mooie code is 't niet. Ik zou het zo doen:
code:
1
2
for(i=1;i<argc;++i)
  uitvoeren[i-1]=argv[i];
is een verschil van smaak kan ook ;)
Dit gaat wel goed. (Is IMHO ook veel leesbaarder bij gebrek aan belachelijk lange tijdelijke variabelen).
dit was een snip uit een groter programma waar ik langere namen gebruikte om het eea duidelijk te houden
i,j,k is voor die soort kleine programma's idd beter

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

Op maandag 29 april 2002 17:49 schreef Sponz het volgende:
exit(1111) is onzin, maak daar dan
code:
1
return EXIT_FAILURE;

van.
kan ook :)
maar in een groter geheel waar dit uitkwam en dit dus met sigchild werd afgevangen was dit "handiger"

btw: waar stond EXIT_FAILURE ook alweer gedeclareerd? (welke header??)

Doet iets met Cloud (MS/IBM)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Nu we toch bezig zijn; die constante is ook ranzig, vooral omdat je er niet op checked en je dus rustig meer argumenten in die array kan schuiven dan er in passen. Een algemenere oplossing zou zijn:
code:
1
2
3
char **args=(char**)malloc(sizeof(char*)*argc);
memcpy(args,&argv[1],sizeof(*argv)*(argc-1));
args[argc-1]=NULL;

  • Sponz
  • Registratie: Juni 2001
  • Niet online

Sponz

nul nest parfait saif moi

Op maandag 29 april 2002 17:52 schreef D2k het volgende:

[..]


btw: waar stond EXIT_FAILURE ook alweer gedeclareerd? (welke header??)
stdlib.h

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 12:58
Op maandag 29 april 2002 17:50 schreef D2k het volgende:
is een verschil van smaak kan ook ;)
Het verschil is dat ik alleen geheugen benader dat ik heb gedeclareerd terwijl jij een beetje in het geheugen over de grenzen van je array gaat zitten vissen. Dat zou ik geen 'verschil van smaak' durven noemen, hoewel dat voor de notiatie misschien wel geldt. Daar was 't me natuurlijk niet om te doen.
Pagina: 1