Toon posts:

[C] Beginnersvraag

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben vrij nieuw met C. Ik ben een CGI programma aan het maken wat een argument moet lezen van de commandline, en hiermee moet bepalen welk commando output het moet geven.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>


main(int arc, char *argv[])
{
        FILE *in;
        char buff[512];
        char comd[20];
        char BEGINHTML[300] = "Layout-kapot-makende-string";

        char ENDHTML[100] = "nog-een-layout-kapot-makende-string";

        switch (argv[1][1])
        {
                case 'p':
                {
                comd = "ps -ax";
                break;
                }

                case 'w':
                {
                comd = "w";
                break;
                }

                case 'd':
                {
                comd = "df -h";
                break;
                }

                default:
                {
                comd = "ps -ax";
                break;
                }
        }


        if (!(in = popen(comd, "r"))) {
                exit(1);
        }

        printf("%s\n",BEGINHTML);

        while (fgets(buff, sizeof(buff), in) != NULL ) {
                printf("%s \n <br>", buff);


        }

        printf("%s",ENDHTML);
        pclose(in);
}


Bij het compilen krijg ik dit:

code:
1
2
3
4
5
6
> cc test2.c
test2.c: In function `main':
test2.c:17: incompatible types in assignment
test2.c:23: incompatible types in assignment
test2.c:29: incompatible types in assignment
test2.c:35: incompatible types in assignment


Ik geloof dat het iets makkelijks is, maar ik zit er nu een half uur op de bedenken, en via google en de got search kom ik er niet achter.

Ik had ook nog een andere vraag:

Kan je in de switch statement ook vergelijkingen maken met strings? of alleen met ints en chars?

[ Voor 41% gewijzigd door Verwijderd op 26-10-2003 23:29 ]


Verwijderd

Is een tijdje geleden dat ik in C geprogrammeerd heb, maar voor zover ik weet kun je strings niet assignen. Dit werkt wel:

char s[100];
strcpy(s, "hello");

  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

Verwijderd schreef op 26 October 2003 @ 23:36:
Is een tijdje geleden dat ik in C geprogrammeerd heb, maar voor zover ik weet kun je strings niet assignen. Dit werkt wel:

char s[100];
strcpy(s, "hello");
Klopt, strings kan je niet kopieren en niet vergelijken, doordat strings (volgens mij) geen primare types zijn.
vergelijken doe je (uit mijn hoofd) met strcmp

edit:
Volgens mij was het doordat je eigenlijk met een pointer te maken hebt
bijv:
char str[100];
char str2[100];

dan is str een pointer die verwijst naar de index van het eerste karakter.
en een pointer is simpelweg niet gelijk aan "iets wat tussen quotes staat"
en als je dan 2 strings gaat vergelijken (in dit geval if (str == str2) ) dan krijg je dus dat deze altijd ongelijk zijn. Tenzij je str = str2 hebt gedaan.

[ Voor 35% gewijzigd door nhimf op 26-10-2003 23:42 ]

Ik stink niet, ik ruik gewoon anders


  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Als je er niets achter gaat plakken zou je van regel 6 kunnen maken:
C:
1
char *s;
Ik hoop dat je je realiseert dat een shell-scriptje gezien de hoeveelheid overhead die een CGI-request teweegbrengt nauwelijks minder efficient is dan wat je nu doet.
Verwijderd schreef op 26 October 2003 @ 23:27:
Kan je in de switch statement ook vergelijkingen maken met strings? of alleen met ints en chars?
Nee.

[ Voor 29% gewijzigd door rollebol op 26-10-2003 23:46 . Reden: tweede vraag ook maar beantwoord ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Verander het type van comd naar const char *.

Verwijderd

strcpy (comd, "jestring");
om de tekst in de string te krijgen, een char pointer kan natuurlijk ook.

en vergelijken:
(strcmp (adres van string1, adres van string2)==0) indien gelijke strings

adres van string is:
char *mijnstring;
char mijnchararr[10];

mijnstring of mijnchararr of &mijnchararr[0]

[ Voor 88% gewijzigd door Verwijderd op 26-10-2003 23:49 ]


Verwijderd

Topicstarter
rollebol schreef op 26 oktober 2003 @ 23:40:
Als je er niets achter gaat plakken zou je van regel 6 kunnen maken:
C:
1
char *s;
Ik hoop dat je je realiseert dat een shell-scriptje gezien de hoeveelheid overhead die een CGI-request teweegbrengt nauwelijks minder efficient is dan wat je nu doet.
Uiteraard, maar dit is voor mij puur om C te leren (en kon geen andere leuke opdrachtjes voor mezelf verzinnen)

strcpy() doet de trick nu. Ik was er zelf denk niet achter gekomen.

C is toch heel anders denken vind ik :)

Er is ook iets mis met mijn argument afhandeling. Misschien dat iemand het ziet ? Het werkt niet op de manier hoe ik het wil.

[ Voor 21% gewijzigd door Verwijderd op 26-10-2003 23:49 ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
code:
1
2
char BEGINHTML[300] = "Layout-kapot-makende-string";
char ENDHTML[100] = "nog-een-layout-kapot-makende-string";


Die 300 en 100 kan je trouwens gewoon weg laten als je een string constant definieert.

Een const char *comd lijkt mij toch het handigst, omdat je alleen maar string constants eraan toewijst.

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
Verwijderd schreef op 26 October 2003 @ 23:46:
[...]


Uiteraard, maar dit is voor mij puur om C te leren (en kon geen andere leuke opdrachtjes voor mezelf verzinnen)

strcpy() doet de trick nu. Ik was er zelf denk niet achter gekomen.

C is toch heel anders denken vind ik :)
strcpy() gebruiken is in dit geval verkeerd denken. Probeer maar voor jezelf na te gaan waarom je beter de pointer-variant kan nemen die ik (en nog iemand na mij) noemde. Dan leer je C.

  • MisterE
  • Registratie: April 2002
  • Laatst online: 25-07 17:46
nhimf schreef op 26 October 2003 @ 23:39:
[...]

Klopt, strings kan je niet kopieren en niet vergelijken, doordat strings (volgens mij) geen primare types zijn.
vergelijken doe je (uit mijn hoofd) met strcmp
Waarschijnlijk bedoel je omdat strings niet 'ordinaal' zijn, althans zo werkt dat bij Delphi dus ik neem aan ook met C.

ordinaal is dus oplopend, zoals: 1,2,3 en/of A,B,C (chars)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
sorry voor deze offtopic reply, maar hal, heb jij (eer)gister toevallig gegamed? Ik vraag het me af, aangezien je nickname me heel bekend in de oren klinkt...

Het antwoord is al gegeven, en mijn C-kennis is gelimiteerd, dus ik zal me verder onthouden van commentaar ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
MisterE schreef op 27 October 2003 @ 00:01:
Waarschijnlijk bedoel je omdat strings niet 'ordinaal' zijn, althans zo werkt dat bij Delphi dus ik neem aan ook met C.
Strings kun je niet direct vergelijken omdat ze geen ingebouwd type zijn zoals in bijvoorbeeld VB of Java. Voor ingebouwde types zijn vergelijkings operatoren gedefinieerd in de taal zelf; voor strings dus niet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Strings hebben wel een ingebouwd type, namelijk char* of char[...] (array van characters) voor "string literals". Beide types hebben ook een vergelijkingsoperator, alleen test die identeit en niet equivalentie. Dat is een moeilijke manier om te zeggen dat twee strings alleen gelijk zijn als ze in het geheugen overlappen, maar niet als op twee plekken dezelfde letters staan. "abc"=="abc" is dus soms wel waar.

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


  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

MSalters schreef op 27 October 2003 @ 13:49:
Strings hebben wel een ingebouwd type, namelijk char* of char[...] (array van characters) voor "string literals".
String bestaan gewoon niet in C. Een 'string' is een array van characters geterminate door een 0. Vanuit het oogpunt van taal is d'r eigenlijk niks geregeld, voor de compiler is het gewoon een rijtje chars achter elkaar.
Beide types hebben ook een vergelijkingsoperator, alleen test die identeit en niet equivalentie. Dat is een moeilijke manier om te zeggen dat twee strings alleen gelijk zijn als ze in het geheugen overlappen, maar niet als op twee plekken dezelfde letters staan. "abc"=="abc" is dus soms wel waar.
:?

Indien je 2 char * vergelijk vergelijk je de inhoud van de pointers, niet hetgeen waar die pointers naar toe wijzen. Om 2 arrays met elkaar te vergelijken bestaan in C geen dingen voor die in de taal zitten. Strings die elkaar overlappen in het geheugen (en dan is de een een substring van de ander) geeft nog steeds een niet-ware vergelijking.

Alleen indien de pointers dezelfde waarde bezitten geeft de vegelijking true terug, en in dat geval zijn de strings per definitie aan elkaar gelijk.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar schreef op 27 oktober 2003 @ 17:16:
[...]


String bestaan gewoon niet in C. Een 'string' is een array van characters geterminate door een 0. Vanuit het oogpunt van taal is d'r eigenlijk niks geregeld, voor de compiler is het gewoon een rijtje chars achter elkaar.
waar vind je de string literal dan onder vallen? Dat is iig geen array definitie, want je kunt een array ook niet meegeven als parameter aan een functie bijvoorbeeld
C++:
1
doeIetsMetEenArrayVanInts ({ 1, 2, 3 });


En in principe is een "string" gewoon een array, namelijk een aaneenschakeling van elementen, in de volle betekenis van het woord :)
Alleen indien de pointers dezelfde waarde bezitten geeft de vegelijking true terug, en in dat geval zijn de strings per definitie aan elkaar gelijk.
Dat zegt MSalters toch ook? Soms is "abc" == "abc" waar, omdat de compiler een duplicaat ontdekt, en dat gewoon mapt op hetzelfde adres. Vaak is dat een compiler-optie overigens.

Overigens zijn de basis string functies vaak wel compiler intrinsics. Ook al hebben ze een legale C functiedefinitie, vaak zijn ze als speciaal geval in de compiler gedefinieerd, waardoor het direct evalueert naar inline assembly code. In die zin zou je het dus kunnen zien als een language construct

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1