2016-10-18 3 views
1

Ich mache ein Projekt zur Erstellung eines Bot, der im Internet surft.printf zeigt nur 24 Zeichen von char *

Ich muss es in C codieren und für jetzt konzentriere ich mich auf die Wahl der Adresse, wo es gehen wird (aus einer Liste in einer Datei ausgewählt). Dies funktioniert einwandfrei, aber wenn ich die Adressen, die der Bot ausgewählt hat, anzeigen lasse, werden einige auf 24 Zeichen gekürzt und mit "!" Das macht den Code mit langen Adressen unbrauchbar. Hat jemand eine Ahnung, wo es herkommen könnte?

Das Programm:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 
#include <math.h> 

int main() { 
    FILE* file = fopen("test.txt", "r+"); 

    char *line = NULL; 
    char *tab[1023]; 
    int tailleTab = 0; 

    line = malloc(sizeof(*line)); 

    if(line == NULL) 
    return(EXIT_FAILURE); 

    while((fgets(line, 1023, file)) != NULL) { 
    if(line[0] != '#' && line[0] != '\n') { 
     tab[tailleTab] = line; 
     line = malloc(sizeof(*line)); 
     tailleTab++; 
    } 
    } 

    srand(time(NULL)); 
    int n = rand()%tailleTab; 
    printf("\n%d = %.32s\n", n, tab[n]); 
    printf("%s\n", tab[n]); 
    fclose(file); 
} 

Die Datei, aus der die Adresse gewählt wird:

www.google.com 
www.wikipedia.org 
www.dahunicorn.xyz 
www.cloudimperiumgames.com 
www.robertspaceindustries.com 
www.candybox2.net 
www.42.com 
www.1337.com 
+0

Teilen Sie Ihre Eingabe bitte - es gibt keine Möglichkeit für uns, es zu erraten !!! Teilen Sie auch Ihre Debugging-Beobachtung mit. –

+0

Bitte geben Sie die Zuweisungen frei, nachdem Sie sie verwendet haben. Gute Angewohnheit, dies auch in einfachen Testschnipsel zu tun. – maxik

Antwort

1

Das Hauptproblem ist folgende:

line = malloc(sizeof(*line)); 

Dies weist nur ein einzigen Zeichen zu line. Der Ausdruck *line ist ein char, was bedeutet, dass Sie sizeof(char) Bytes zuweisen, und sizeof(char) ist definiert als immer 1.

Das bedeutet, dass Ihr Anruf an fgets außerhalb der Grenzen Ihres zugewiesenen Speichers schreiben wird und Sie haben undefined Verhalten.

Es gibt keinen Grund, line dynamisch zuzuweisen. Erstellen Sie es stattdessen als ein Array, und verwenden Sie dann strdup, wenn Sie es in dem Array tab speichern. Entweder das oder mehr Speicher zuweisen (1023 ist eine gute Zahl, da diese Menge an fgets übergeben wird).

0

Wie bereits in einer anderen Antwort, mit diesem Code:

line = malloc(sizeof(*line)); 

Sie mit malloc ein einzelnen char auf dem Heap sind Zuteilung, da der Ausdruck *line zu einem char (als line entsprechen wird als char * deklariert).

Ich würde Ihren Code mit dem Namen Konstanten anstelle von magischen Zahlen wie 1023 vereinfachen, die durch den Code verteilt sind (und mache es schwieriger zu halten), zusätzlich zu dem nur Platz reserviert für die temporären line Puffer auf dem Stack statt dynamisch auf dem Heap zuweisen, z:

/* Instead of: line = malloc(sizeof(*line)); */ 
#define LINE_MAX_SIZE 1024 
char line[LINE_MAX_SIZE]; 

Sehen Sie sich auch tun: mit LINE_MAX_SIZE anstelle der magischen Zahl 1023 betrachten

#define TAB_MAX_ITEMS /* 1023 or whatever */ 
char* tab[TAB_MAX_ITEMS]; 

Im while Schleife:

while ((fgets(line, LINE_MAX_SIZE, file)) != NULL) { 

Sie auch einen Scheck an die möchten hinzufügen Index im Array tab, um Pufferüberläufe zu vermeiden:

if (tailleTab >= TAB_MAX_ITEMS) { 
    /* Index out of range */ 
    ... 
} 

/* tailleTab is a valid index. 
* Deep-copy the line read in the temporary buffer 
* and save a pointer to the copy into the tab array. 
*/ 
tab[tailleTab] = strdup(line); 

Im Produktionscode sollten Sie auch die im Array gespeicherten Zeiger durchlaufen und free aufrufen, um den auf dem Heap zugewiesenen Speicher freizugeben.