Größe eines char array



  • Hallo

    wenn ein array den Datentyp char zugewiesen bekommt, weil Buchstaben im array sein werden, wie viele Zeichen lassen sich dann maximal in dieses array speichern? Etwas wie long char bringt einen Fehler, weil long etwas anderes ist. Gibt es die Möglichkeit, dass einem array "viel Platz" deklariert wird?

    Ich habe ein Programm, welches nicht funktioniert, bei dem ich den Verdacht habe, dass das char array zu klein ist. Gebe ich dem array aber mehr Zeichen, änder sich nichts. Momentan hat es 8192 Zeichen und ich denke, dass das zu wenig ist.

    Danke
    Grüße



  • In das Array passen 8 kibichar.
    Wie viel Platz brauchst du.
    Was macht das Programm, es funktioniert nicht ist keine gute Fehlerbeschreibung.

    Du könntest dynamischen Speicher benutzen und entsprechend die Größe zur Laufzeit anpassen.



  • Hi

    Das Konzept des dynamischen Speichers habe ich noch nicht gelernt. Ich lese darüber.

    Das Programm soll den html Code einer Internetseite in ein char Array speichern und dieses dann in eine Textdatei speichern. Mittels, inzwischen tagelangem einlesen und recherchieren, bin ich bei folgendem Code gelangt, welchen ich derzeit studiere mittels Lehrbuch und Internet, denn ich will ja schließlich auch die Sprache C lernen und verstehen, gleichzeitig mich aber auch meinem Ziel nähern, was ich programmieren will. Dieser funktioniert und die entstandene Textdatei enthält zu wenige Zeichen, denn wenn ich mir im Browser den html Code von http://www.finanzen.net/index/DAX ansehe, ist dieser deutlich länger. Im char array buffer befindet sich der html Code.

    /* Download von html code
     *  
     * Befehl zum Download:
       ./httpget www.finanzen.net http://www.finanzen.net/index/DAX
                                                                    */
    
    #include <stdio.h>
    #include <errno.h>
    
    #ifdef _WIN32
    /* Headerfiles für Windows */
    #include <winsock.h>
    #include <io.h>
    
    #else
    /* Headerfiles für Unix/Linux */ 
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <stdlib.h>
    #include <string.h>
    #define closesocket(s) close(s)
    #endif
    
    /* http requests werden normalerweise auf Port 80 
     * vom Server entgegengenommen */
    #define HTTP_PORT 80
    
    /****************** MAIN *********************/
    int main( int argc, char **argv)
    {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
        int sock;
        char buffer[8192];
        int count;
    
    #ifdef _WIN32  
        /* Initialisiere TCP für Windows ("winsock") */
        short wVersionRequested;
        WSADATA wsaData;
        wVersionRequested = MAKEWORD (1, 1);
        if (WSAStartup (wVersionRequested, &wsaData) != 0) {
            fprintf( stderr, "Failed to init windows sockets\n");
            exit(1);
        }
    #endif
    
        /* Sind die erforderlichen Kommandozeilenargumente vorhanden? */
        if (argc != 3) {
            fprintf( stderr, "usage: httpget server file\n");
            exit(1);
        }
    
        /* Erzeuge das Socket */
        sock = socket( PF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
            perror( "failed to create socket");
            exit(1);
        }
    
        /* Erzeuge die Socketadresse des Servers 
         * Sie besteht aus Typ, IP-Adresse und Portnummer */
        memset( &server, 0, sizeof (server));
        if ((addr = inet_addr( argv[1])) != INADDR_NONE) {
            /* argv[1] ist eine numerische IP-Adresse */
            memcpy( (char *)&server.sin_addr, &addr, sizeof(addr));
        }
        else {
            /* Wandle den Servernamen in eine IP-Adresse um */
            host_info = gethostbyname( argv[1]);
            if (NULL == host_info) {
                fprintf( stderr, "unknown server: %s\n", argv[1]);
                exit(1);
            }
            memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length);
        }
    
        server.sin_family = AF_INET;
        server.sin_port = htons( HTTP_PORT);
    
        /* Baue die Verbindung zum Server auf */
        if ( connect( sock, (struct sockaddr*)&server, sizeof( server)) < 0) {
            perror( "can't connect to server");
            exit(1);
        }
    
        /* Erzeuge und sende den http GET request */
        sprintf( buffer, "GET %s HTTP/1.0\r\n\r\n", argv[2]);
        send( sock, buffer, strlen( buffer), 0);
    
        /* Hole die Serverantwort und speichere sie in Text Datei ab */
        do {
            count = recv( sock, buffer, sizeof(buffer), 0);        
    
    FILE *fp;    // Zeiger auf eine File-Struktur, wird zur Dateibearbeitung benoetigt
        //char text[] = "Dies ist das Array.";    // das char-array
    
        if((fp = fopen("html_code_DAX.txt", "w+")) == NULL)     // fopen gibt den Zeiger fp zurueck oder NULL,
            printf("konnte Datei nicht oeffnen.\n");    // wenn es nicht geklappt hat,
        else {    // "w" oder "w+" oeffnet zum Schreiben, wenn Datei nicht existiert, wird sie erzeugt, sonst ueberschrieben
            fprintf(fp, "%s", buffer);    // fprintf schreibt das Array in die Datei
            fclose(fp);    // fclose schliesst die Datei wieder
        }
    
        }
        while (count > 0); 
    
        /* Schließe Verbindung und Socket */
        closesocket( sock);
        return count;
    }
    

    Danke für die Hilfe
    Grüße



  • 1. Warum cstatst du das erste element von memcpy nach chr* ??
    2. warum öffnest du die Ziel Datei jedesmal neu zeile 102 bzw warum benutzt du nicht "a" für append
    3. woher weißt du das buffer nach Zeile 97 korrekt nullterminiert ist
    4. was macht das Programm denn bis jetzt??



  • Hi

    Der Code ist aus Recherche von Socket Programmierung zusammen gestückelt und ich habe ihn noch nicht richtig durchdrungen. Daran arbeite ich aber täglich.

    Das Programm erstellt eine Textdatei, in welcher Teile des html Codes von http://www.finanzen.net/index/DAX gespeichert werden, aber eben nicht alles. Einen Fehler erhalte ich nicht.

    Deine ersten drei Fragen kann ich leider noch nicht beantworten.

    Da aber auf den ersten Blick alles stimmt, ausser das zu wenig html code in der Textdatei ist, hatte ich eben den Verdacht, dass das char array buffer zu klein ist.

    Gruß



  • so hab schnell etwas rumgebastelt,
    Änderungen sind vorallem am ende, und bei linux includes, habe die (char*) casts entfernt
    geteste auf Linux lädt die Datei herunter

    #include <stdio.h>
    #include <errno.h>
    
    #ifdef _WIN32
    /* Headerfiles für Windows */
    #include <winsock.h>
    #include <io.h>
    
    #else
    /* Headerfiles für Unix/Linux */
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <stdlib.h>
    #include <string.h>
    #define closesocket(s) close(s)
    #endif
    
    /* http requests werden normalerweise auf Port 80
     * vom Server entgegengenommen */
    #define HTTP_PORT 80
    
    /****************** MAIN *********************/
    int main( int argc, char **argv)
    {
        struct sockaddr_in server;
        struct hostent *host_info;
        unsigned long addr;
        int sock;
        char buffer[8192];
        ssize_t count;
    
    #ifdef _WIN32  
        /* Initialisiere TCP für Windows ("winsock") */
        short wVersionRequested;
        WSADATA wsaData;
        wVersionRequested = MAKEWORD (1, 1);
        if (WSAStartup (wVersionRequested, &wsaData) != 0) {
            fprintf( stderr, "Failed to init windows sockets\n");
            exit(1);
        }
    #endif
    
        /* Sind die erforderlichen Kommandozeilenargumente vorhanden? */
        if (argc != 3) {
            fprintf( stderr, "usage: httpget server file\n");
            exit(1);
        }
    
        /* Erzeuge das Socket */
        sock = socket( PF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
            perror( "failed to create socket");
            exit(1);
        }
    
        /* Erzeuge die Socketadresse des Servers
         * Sie besteht aus Typ, IP-Adresse und Portnummer */
        memset( &server, 0, sizeof (server));
        if ((addr = inet_addr( argv[1])) != INADDR_NONE) {
            /* argv[1] ist eine numerische IP-Adresse */
            memcpy(&server.sin_addr, &addr, sizeof(addr));
        }
        else {
            /* Wandle den Servernamen in eine IP-Adresse um */
            host_info = gethostbyname( argv[1]);
            if (NULL == host_info) {
                fprintf( stderr, "unknown server: %s\n", argv[1]);
                exit(1);
            }
            memcpy( &server.sin_addr, host_info->h_addr, host_info->h_length);
        }
    
        server.sin_family = AF_INET;
        server.sin_port = htons( HTTP_PORT);
    
        /* Baue die Verbindung zum Server auf */
        if ( connect( sock, (struct sockaddr*)&server, sizeof( server)) < 0) {
            perror( "can't connect to server");
            exit(1);
        }
    
        /* Erzeuge und sende den http GET request */
        sprintf( buffer, "GET %s HTTP/1.0\r\n\r\n", argv[2]);
        if(send( sock, buffer, strlen( buffer), 0) == -1) {
        	perror("send");
        	closesocket(sock);
        	return EXIT_FAILURE;
        }
    
        /* Hole die Serverantwort und speichere sie in Text Datei ab */
        FILE *fp = fopen("html_code_DAX.txt", "w");
        if(fp == NULL) {
        	printf("konnte Datei nicht öffnen.\n"); 
        } else {
        	do {
            	count = recv( sock, buffer, sizeof(buffer) -1, 0);        
            	buffer[count] = '\0';
            	fprintf(fp, "%s", buffer);    // fprintf schreibt den String in die Datei
        	}
        	while (count > 0);
        }
    
        /* Schließe Verbindung und Socket */
        closesocket( sock);
        return EXIT_SUCCESS;
    }
    


  • Hi

    erstmal: Vielen Dank. Du bist mein Held 🙂 Das klappt genau so wie ich es möchte.

    Nun werde ich mich weitere Tage hinsetzen mit meinem Lehrbuch und den Code studieren, um das zu verstehen, während ich die Übungen in meinem Buch weiter mache. Das sind im Gegensatz zu dem hier kleine Sachen.

    Wenn das getan ist und ich es verstehe, will ich ein Programm schreiben, welches den aktuellen DAX Punktestand ausliest und danach ein Programm, welches dies alle 30 Sekunden macht, damit ich den Kurs in Echtzeit protokollieren kann 🙂

    Das werde ich dann aber in R machen, da ich R deutlich besser kann als C, was ich jetzt erst erlerne.

    Falls ich beim Code studieren nicht weiter komme, melde ich mich hier wieder und frage nach, was da passiert.

    Viele Grüße


Anmelden zum Antworten