Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo!

Ich habe erst vor kurzem mit C angefangen und Teile eines Programms übernommen. Inzwischen habe ich einiges verändert und habe jetzt eben einen Fehler den ich mir nicht erklären kann.

Ich habe 2 HTML Seiten die jeweils in der Variablen "site" ihren Namen (also "test" und "setup") übergeben.

Anhand von dieser Variablen soll mein CGI Programm in C die Werte verarbeiten, und anschließend die gesetzten Werte auf der jeweiligen Seite wieder ausgeben.

Allerdings gibt er mir bei if (site=="test") anschließend setup.html aus (bei (site=="setup") gibt er auch setup.html aus, setzt aber die Werte nicht ...

 if (site=="test")
{
param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/*
Kopieren des Templates als neues html file
*/

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/*
Einfuegen einer Funktion, welche die neu eingestellten Werte setzt
*/

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);
}

else if (site=="setup")
{
setup = fopen("/home/httpd/ohne_frames/setup.html", "r");
if (!setup) return 0;

s_temp = fopen("/home/httpd/setup.html", "w");
if (!s_temp) return 0;

while (!feof(setup))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, setup);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{

fprintf(s_temp, "<script> function loaded(){\n");
if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");

fprintf(s_temp, "}</script>\n");
}
fputs(line, s_temp);
}

fclose(s_temp);

s_temp_in = fopen("/home/httpd/setup.html", "r");

while (!feof(s_temp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, s_temp_in);
fwrite(buf, 1, len, stdout);
}
fclose(s_temp_in);
}
[/PHP]

Wo liegt denn der Fehler?

ich hab: char site [20]; und strcpy(site, "site");

Wenn ich das auf:

 if (strcpy (site, "site")=="test")

ändere ... ändert sich nichts ...

ändert leider auch nichts ... versteh das nicht :(

okay:

int main(int argc, char *argv[])
{
int prog;
int par;
int lang;
int unit;
char site[20];
FILE * param;
FILE * test;
FILE * dynp;
FILE * dynp_in;
FILE * setup;
FILE * s_temp;
FILE * s_temp_in;

int kom_handle;

/* Lesen der Umgebungsparameter */

const char * rm = GetEnv("REQUEST_METHOD");
const char * cl = GetEnv("CONTENT_LENGTH");

int len = atoi(cl);
char * buffer = malloc(len+1);

if (strcmp(rm, "POST") == 0)
{
fread(buffer,1, len, 0);
buffer[len+1] = 0;
} else if (strcmp(rm,"GET")==0)
{
buffer = getenv("QUERY_STRING");
}
/* Lesen aller Form Parameter */

ParseFormParameters(buffer);

/* Zugriff auf ausgewaehlte Parameter */

prog = atoi(FindParameterValue("program"));
par = atoi(FindParameterValue("parameter"));
lang = atoi(FindParameterValue("language"));
unit = atoi(FindParameterValue("torqueunit"));
strcpy (site, "site");

/* Ablage der Daten in einer "Parameterdatei" */

test = fopen("test.dat", "w");

fprintf(test, "%i\n", prog);
fprintf(test, "%i\n", par);
fprintf(test, "%i\n", lang);
fprintf(test, "%i\n", unit);

/* Erzeugen der Antwort an den Browser */

printf("content-type: text/html\n\n");

/* Oeffnen des Templates */

if(0 == strcmp(site, "test"))
{
param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/* Kopieren des Templates als neues html file */

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
if (prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);
}

else
{
setup = fopen("/home/httpd/ohne_frames/setup.html", "r");
if (!setup) return 0;

s_temp = fopen("/home/httpd/setup.html", "w");
if (!s_temp) return 0;

while (!feof(setup))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, setup);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{

fprintf(s_temp, "<script> function loaded(){\n");
if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");

fprintf(s_temp, "}</script>\n");
}
fputs(line, s_temp);
}

fclose(s_temp);

s_temp_in = fopen("/home/httpd/setup.html", "r");

while (!feof(s_temp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, s_temp_in);
fwrite(buf, 1, len, stdout);
}
fclose(s_temp_in);
}[/PHP]


strcpy (site, "site");
...
if(0 == strcmp(site, "test"))
[/PHP]

Du setzt site auf "site" und vergleichst dann mit "test"?

[PHP]
if(prog == 1) fprintf(dynp, "document.forms[0].program[0].checked=true;\n");
else if (prog == 2) fprintf(dynp, "document.forms[0].program[1].checked=true;\n");
else if (prog == 3) fprintf(dynp, "document.forms[0].program[2].checked=true;\n");

Machs doch so:


fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1);
[/PHP]

Mit deinen anderen if-if/else-Kaskaden kannst du das gleiche machen.

[PHP]
getline(&line,&l, setup);

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

if (lang == 1) fprintf(setup, "document.SetupForm.language[0].checked=true;\n");
else if (lang == 2) fprintf(setup, "document.SetupForm.language[1].checked=true;\n");

if (unit == 1) fprintf(setup, "document.SetupForm.torqueunit[0].checked=true;\n");
else if (unit == 2) fprintf(setup, "document.SetupForm.torqueunit[1].checked=true;\n");
else if (unit == 3) fprintf(setup, "document.SetupForm.torqueunit[2].checked=true;\n");
else if (unit == 4) fprintf(setup, "document.SetupForm.torqueunit[3].checked=true;\n");
else if (unit == 5) fprintf(setup, "document.SetupForm.torqueunit[4].checked=true;\n");
else if (unit == 6) fprintf(setup, "document.SetupForm.torqueunit[5].checked=true;\n");
[/PHP]

Auch hier reicht je eine Zeile:

[PHP]
fprintf(setup, "document.SetupForm.language[%d].checked=true;\n", lang - 1);
fprintf(setup, "document.SetupForm.torqueunit[%d].checked=true;\n", unit - 1);


strcpy (site, "site");
...
if(0 == strcmp(site, "test"))
[/PHP]

Du setzt site auf "site" und vergleichst dann mit "test"?

Hast Recht - ist üflü - strcpy ist gelöscht ...

[PHP]
getline(&line,&l, setup);

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

Das sind die einzigen 2 Vorkommen von getline ...


getline(&line,&l, setup);
[/PHP]

Wie sieht getline aus? Ich vermute da ein massives Speicherleck.

So wie ich es verstehe, sind die Parameter falsch. Gibt er dir keine Fehlermeldung dazu aus? Der 3. Parameter (so wie ich es weiss), muss immer angeben, bis zu welchem Zeichen er die Zeile einlesen soll.

Ich kenne getline nur in Verbindung mit ifstream.

Du könntest es doch auch mit

[PHP]
char *gets(char *buffer);

versuchen.

Wenn du aber bei getline bleiben magst, kann ich dir nur das hier vorschlagen

(es gibt vielleicht noch andere, aber ich kenne halt nur diese):



#include <fstream.h> //muss vorhanden sein

//...

ifstream read_in;
char *text[100];
string text2;

//Datei öffnen
read_in.open("Pfad", ios::in);

//erste Möglichkeit
getline(read_in, text2, '\n'); //liest bis ersten '\n' Zeichen alles ein

//zweite Möglichkeit
read_in.getline(text, 100, '\n'); //liest bis erstes '\n' Zeichen alles ein
[/PHP]

bei der zweiten Möglichkeit, solltest du darauf achten, dass das Feld groß genug ist, daher ziehe ich die erste Möglichkeit vor.

Gruß Kitty

=============================

Sorry, hatte es überlesen, dass er in C progammiert ... :floet:

Aber der Wille, ihm zu helfen, zählt ;)

"sie" wäre mir lieber als "er" ;)

es kommt noch einmal in der main.c vor - wobei ich mir auch nicht sicher bin, wozu die Datei gut ist ... ist praktisch das selbe wie die cgiread.c an der ich jetzt arbeite - nur auf einem älteren Stand.

Ansonsten sind das die einzigen 3x wo "getline" vorkommt im header file stehen nur ein Paar Zeilen aber nichts von "getline" habe das ganze Projekt danach durchsuchen lassen ...

kein Problem :D

main.c ist auch in dem Projekt-Ordner wird aber nicht aufgerufen - ist wie gesagt die "Ursprungs-Version" von der cgiread.c an der ich jetzt arbeite - und da es praktisch eine alte Kopie ist, ist auch ne main-Funktion drin ...

ja, der Fehler ist immer noch der selbe ... Daten werden übermittelt und verarbeitet (in test.dat geschrieben, ...), aber die erneute Anzeige im Browser ist immer noch falsch bei test.html kommt setup.html und bei setup.html eben auch, aber ohne die gesetzten Werte ...

Also, habe gerade rausgefunden, dass wenn ich die if-Anweisung weglasse und den 2. Teil (also die Seite setup.html und deren Auswertung) auskommentiere, dann klappt test.html einwandfrei. :rolleyes:

Also ist da der Wurm drin ... nur wo? :confused:

Naja - im Moment mache ich ja keine Abfrage von der Variablen "site" mehr ...

Aber im ursprünglichen Code doch, oder?

Wie soll diese Abfrage funktionieren, wenn site nie mit Daten gefüllt wird?

Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat.

Was im Moment übrig ist und funktioniert sieht so aus:


/*#define _GNU_SOURCE*/

#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <kommun.h>
#include <sys/types.h>
#include <sys/stat.h>

char translateHex(char hex);
void ParseFormParameters(char * inp);
const char * FindParameterValue(const char * name);
const char * GetEnv(const char * what);

struct Parameter_s
{
char * name;
char * value;
};

typedef struct Parameter_s Parameter;

static Parameter * FormParameters = 0;
static int NumFormParameters = 0;

char translateHex(char hex)
{
if(hex >= 'A')
return (hex & 0xdf) - 'A' + 10;
else
return hex - '0';
}

void ParseFormParameters(char * inp)
{
static char * result;
int tp,i;
int num_par = 1;
char * rp, * gp;

int len = strlen(inp);
if (len == 0)
{
NumFormParameters = 0;
}
result = 0;

if (result != 0) free(result);
result = (char *) malloc(len);

tp=0;
for(i = 0; i < len; i++)
{
if(inp[i] == '+')
result[tp++] = ' ';
else if(inp[i] == '%')
{
result[tp++] =
translateHex(inp[i + 1]) * 16 +
translateHex(inp[i + 2]);
i += 2; /* Move past hex code */
} else /* An ordinary character */
result[tp++] = inp[i];
}
len = tp;

for (i = 0; i<len; i++)
{
if (result[i] == '&') num_par++;
}
if (FormParameters != 0) free(FormParameters);
FormParameters = (Parameter *) malloc(sizeof(Parameter) * num_par);
NumFormParameters = num_par;

rp = result;
for (i=0; i< num_par; i++)
{
FormParameters[i].name = "";

gp = strchr(rp, '=');
if (gp == 0) break; /* error missing assignment */

*gp = 0;
FormParameters[i].name = rp;
gp++;
rp = gp;

gp = strchr(rp, '&');
if (gp != 0) *gp = 0;
FormParameters[i].value = rp;
if (gp!=0) rp = gp+1; else break;
}
}

const char * FindParameterValue(const char * name)
{
int i;
for (i=0; i< NumFormParameters; i++)
{
if (strcmp(name, FormParameters[i].name) == 0)
{
return FormParameters[i].value;
break;
}
}
return "";
}

const char * GetEnv(const char * what)
{
char * r = getenv(what);
if (!r) return "";
else return r;
}

int main(int argc, char *argv[])
{
int prog;
int par;
int lang;
int unit;
char site[20];
FILE * param;
FILE * test;
FILE * dynp;
FILE * dynp_in;
FILE * setup;
FILE * s_temp;
FILE * s_temp_in;

int kom_handle;

/* Lesen der Umgebungsparameter */

const char * rm = GetEnv("REQUEST_METHOD");
const char * cl = GetEnv("CONTENT_LENGTH");

int len = atoi(cl);
char * buffer = malloc(len+1);

if (strcmp(rm, "POST") == 0)
{
fread(buffer,1, len, 0);
buffer[len+1] = 0;
} else if (strcmp(rm,"GET")==0)
{
buffer = getenv("QUERY_STRING");
}

/* Lesen aller Form Parameter */
ParseFormParameters(buffer);

/* Zugriff auf ausgewaehlte Parameter */
prog = atoi(FindParameterValue("program"));
par = atoi(FindParameterValue("parameter"));
lang = atoi(FindParameterValue("language"));
unit = atoi(FindParameterValue("torqueunit"));

/* Ablage der Daten in einer "Parameterdatei" */
test = fopen("test.dat", "w");

fprintf(test, "%i\n", prog);
fprintf(test, "%i\n", par);
fprintf(test, "%i\n", lang);
fprintf(test, "%i\n", unit);

/* Erzeugen der Antwort an den Browser */

printf("content-type: text/html\n\n");

/* Oeffnen des Templates */

param = fopen("/home/httpd/ohne_frames/test.html", "r");
if (!param) return 0;

dynp = fopen("/home/httpd/test.html", "w");
if (!dynp) return 0;

/* Kopieren des Templates als neues index file */

while (!feof(param))
{
char * line = 0;
size_t l = 0;
getline(&line,&l, param);
if ((strstr(line, "</BODY>") != 0) || (strstr(line, "</body>") != 0))
{
/* Einfuegen einer Funktion, welche die neu eingestellten Werte setzt */

fprintf(dynp, "<script> function loaded(){document.forms[0].parameter.value=\"%i\";\n", par);
fprintf(dynp, "document.forms[0].program[%d].checked=true;\n", prog-1);
fprintf(dynp, "}</script>\n");
}

fputs(line, dynp);
}
fclose(dynp);

dynp_in = fopen("/home/httpd/test.html", "r");

while (!feof(dynp_in))
{
char buf[1024];
len = fread(&buf, 1, 1024, dynp_in);
fwrite(buf, 1, len, stdout);
}
fclose(dynp_in);

umask(~0666);

/* Erzeugen einer benannten Fifo Datei */

mknod("/tmp/deprag_simul_cgicom.pipe", 0666 | S_IFIFO, 0);

kom_handle = open("/tmp/deprag_simul_cgicom.pipe", O_RDWR | O_NONBLOCK);
if (kom_handle != -1)
{
KommunikationsStruktur ks;

ks.ProgrammNummer = prog;
ks.Parameter = par;
ks.Sprache = lang;
ks.Momenteinheit = unit;

write(kom_handle, &ks, sizeof(ks));
close(kom_handle);
}

return 0;
}
[/PHP]

Versteh deine Frage nicht ganz - die Variable "site" speichert doch bloß WELCHE Seite jetzt gerade Daten übertragen hat.

Wie kommt diese Information in site rein? In dem Code auf Seite 1 dieses Threads ist site ein Array von 20 char, das nicht initialisiert wird. site kann nichts speichern, weil nirgendwo im Code irgendein Inhalt in site abgelegt wird.

Hast Recht ... ich blick da irgendwie nicht (mehr) durch ...

Hab das Problem jetzt "gelöst" - bzw umgangen, indem ich einfach eine Zahl statt "test" übergebe ... Danke für die Hilfe!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.