C Wie füge ich in system() mehrere Arrays ein?

Ralaud

Cadet 3rd Year
Registriert
Mai 2017
Beiträge
43
Hay, ich bin auf das Programm wkhtmltopdf.org, wie der Name schon sagt wandelt es den HTML-Code einer Seite in ein PDF Dokument um. Ich fand dies sehr nützlich, nur leider gibt es keine GUI dafür. Man muss deswegen jedes mal in den Terminal wechseln und z.B.
Code:
wkhtmltopdf https://www.computerbase.de/ computerbase.pdf
eingeben. Deswegen wollte ich diesen Prozess gerne grafisch darstellen. In GTK+ muss ich mich nacher noch einarbeiten. Ich versuche es, weil ich gerne meine Kenntnisse in der Programmiersprache C erweitern möchte. Mit der GUI will ich euch nicht nerven, da muss ich so oder so noch vieles anschauen, weil ich noch nie eine GUI gemacht habe. Zu meinem eigentlichen Anliegen.

An der Stelle system() wollte ich gerne nach dem wkhtmltopdf die Arrays 'website' und 'filename' hinzufügen, habe paar Sachen im Internet angeschaut, aber finde mich nicht zurecht. Wie füge ich die Arrays jetzt ein?

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

int main()
{
    int a;
    char website[999], filename[999];

    printf("Enter your Website Url (copy and paste)!\nUrl: ");
    fgets(website, sizeof (website), stdin);

    printf("\nEnter the name for the file that will be saved!\nFilename: ");
    fgets(filename, sizeof (filename), stdin);




    printf("\n\n---------------Options--------------\n\n[1] Convert Website into a PDF\n\n[2] Convert Website into an Image\n\n");
    scanf("%d", &a);

    switch (a)
    {
        case 1: 
                system(("wkhtmltopdf "+website+" "+filename+".pdf ").c_str());
            break;

        case 2: 
                system(("wkhtmltoimage "+website+" "+filename+".png ").c_str());
            break;
    }


    return 0;
}

Vielen dank schon einmal im voraus :)

Mit freundlichen Grüßen.
 
Ich sehe 2 Optionen:
1) direkt libwkhtmltox verwenden - dann brauchst du keine seperate Binary mehr (bevorzugt.)
2) snprintf zum Erzeugen des Command-Line Strings
 
Zuletzt bearbeitet:
Möchtest du dich denn bewusst auf C beschränken oder wäre C++ auch in Ordnung? Zur Beantwortung deiner Frage ist diese Information entscheidend, doch sie geht meiner Meinung nach nicht eindeutig aus deinem Text hervor (im Titel steht zwar [C], aber in deinem Code nutzt du z.B. c_str()).

Falls es bei C bleiben soll, müsstest du mit strcat() oder sprintf() arbeiten, um deinen Befehl aus den Einzelteilen zusammenzusetzen.

In C++ kannst du hingegen mit der Klasse std::string arbeiten und die Verknüpfung durch den + Operator durchführen (so ähnlich hast du es ja bereits versucht).

Eine Anmerkung am Rande: Es gibt wkhtmltopdf auch als Bibliothek, welche du direkt aus deinem Programm heraus nutzen könntest. Je nach dem, wie weit du das Ganze treiben willst, könnte das eine Option sein (dann könnte man auf system() verzichten).
 
Danke euch beiden, für die hilfreichen Antworten. Die libwkhtmltox hatte ich leider nicht gesehen gehabt, werde ich mir gleich noch in ruhe anschauen. Leider ist es mir zurzeit nicht möglich in C++ zu programmieren(wäre vorteilhafter, da ich dann auch den qt-creator nutzen kann, doch da müsste ich bei C++ überhaupt die Grundkenntnisse erlernen), wollte mich erst in C einarbeiten. Meine Grundidee war eigentlich durch den Befehl system() mit Abhängigkeit des bestehenden Programms den Befehl wkhtmltopdf mit der entsprechenden Url und Dateinamen im Terminal auszuführen und dies nachher grafisch darzustellen. Das c_str() hatte ich aus einer Seite eigentlich für C gefunden gehabt um zu erfahren wie ich bei system() variablen hinzufüge.

Kleine Frage am Rande: Ist die GUI die ich für das Programm erstellen will mit C++ besser zu bewältigen? Wenn ja würde ich anfangen auch C++ zu lernen. Da aber die wichtigen Bereiche von libwkhtmltox in C geschrieben wurden, würde auch C reichen oder?
 
Zuletzt bearbeitet:
Hier das grobe Vorgehen in reinem C (nicht getestet):

Code:
/* fgets schreibt u.U. "\n" (newline), also entfernen */
website [strcspn(website,  "\n")] = 0;
filename[strcspn(filename, "\n")] = 0;

/* ... */
char command[2*998+20]; /* genug Platz für beide Befehls-Varianten */
snprintf(command, sizeof(command), "wkhtmltopdf %s %s.pdf", website, filename);
printf(command); /* zur Kontrolle nochmal ausgeben */

/* ... */
system(command);

Falls es Unklarheiten gibt, einfach nochmal nachfragen. :)

Ob C++ für die GUI-Programmierung Vorteile bietet, ist vermutlich eine Glaubensfrage. Meiner Meinung nach: Ja. Andererseits ist GTK+ eine reine C-Bibliothek. Es gibt aber auch andere bekannt GUI-Frameworks wie Qt, welche von vornherein auf C++ setzen (libwkhtmltox nutzt übrigens Qt!).
 
Ralaud schrieb:
Ist die GUI die ich für das Programm erstellen will mit C++ besser zu bewältigen?
Ja. Die libwkhtmltox ist schon relativ nah am Qt-Framework angesiedelt (keine direkte Dependency, aber verwandt), welches eines der bekanntesten Frameworks für GUIs ist. Den Weg würde ich dir empfehlen.

Daneben fallen mir (platform-übergreifend) noch GTK+, wxwidgets und Nuklear ein.
 
Erstmal möchte euch allen noch einmal für eure Hilfe danken, schade das es hier im Forum kein Danke-Button existiert.

ph4nt0m schrieb:
Ob C++ für die GUI-Programmierung Vorteile bietet, ist vermutlich eine Glaubensfrage. Meiner Meinung nach: Ja. Andererseits ist GTK+ eine reine C-Bibliothek. Es gibt aber auch andere bekannt GUI-Frameworks wie Qt, welche von vornherein auf C++ setzen (libwkhtmltox nutzt übrigens Qt!).

Dein Code hat mir sehr weiter geholfen, also ist es nur möglich ein Array in system() einzugeben, wenn man erst mehrere Arrays in ein neues Array gespeichert hat. Hab es ausprobiert und es hat auch super funktioniert.


Kanibal schrieb:
Ja. Die libwkhtmltox ist schon relativ nah am Qt-Framework angesiedelt (keine direkte Dependency, aber verwandt), welches eines der bekanntesten Frameworks für GUIs ist. Den Weg würde ich dir empfehlen.

Daneben fallen mir (platform-übergreifend) noch GTK+, wxwidgets und Nuklear ein.

Da Ihr beiden mir empfiehlt und auch sehr viele Programme dessen GUIs auf QT bassieren, werde ich in Zukunft mich auch in C++ einarbeiten.

asdfman schrieb:
Für sowas gibt es doch die exec()-Familie. system() benutzt man nicht. Egal in welchem Kontext.

http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html

€: Unter Windows gibt es dann natürlich noch CreateProcess().

Ich hatte die exec() Befehle auch angesehen, aber schlussfolgert das diese nur ein bestimmtes Programm ausführen und nicht ein Befehl wie system() im Terminal ausführen kann. Korrigiere mich bitte, wenn ich falsch liege.
 
Ralaud schrieb:
Ich hatte die exec() Befehle auch angesehen, aber schlussfolgert das diese nur ein bestimmtes Programm ausführen [...] kann.
Das ist exakt das, was du willst.
Code:
execlp("wkhtmltopdf", "wkhtmltopdf", website, filename_with_ext, (char *) NULL);
 
Zurück
Oben