2017-09-20 2 views
4

Ich versuche, etwas Text im allgemeinen Protokollformat zu drucken.printf() - druckt falsche Reihenfolge. Works, wenn separat gedruckt

printf("%s - - [%s] %s %d %zu\n", ip, _time, row, statuscode, size); 

Das Problem ist, dass die Reihenfolge alle durcheinander kommt. Die Ausgabe lautet:

200 1511 - - [20/Sep/2017:13:07:32 +0200] GET/HTTP/1.1 

Ich denke (1511) ist die ip gedruckt zu werden. Ich weiß nicht warum.

Wenn ich drucke sie wie folgt aus:

printf("1. %s\n", ip); 
printf("2. %s\n", _time); 
printf("3. %s\n", row); 
printf("4. %d\n", statuscode); 
printf("5. %zu\n", size); 

Es ist wie erwartet funktioniert:

1. 127.0.0.1 
2. 20/Sep/2017:13:11:24 +0200 
3. GET/HTTP/1.1 
4. 200 
5. 151 

Es scheint, das Problem beginnt, wenn ich statuscode aus irgendeinem Grund hinzuzufügen. Ich habe keine Ahnung warum. Jede Hilfe wird geschätzt. Hier

ist die Funktion, wo ich prinft() verwenden:

static void handlelogging(char* method, struct sockaddr_storage client_addr, size_t size, char* row, int statuscode) { 

char* ip; 
char _time[80]; 
struct tm *info; 
time_t rawtime; 

time(&rawtime); 
info = localtime(&rawtime); 
strftime(_time, 80,"%d/%b/%Y:%H:%M:%S %z", info) 
ip = getip(client_addr); 

//Print goes here, see above. 
} 

Als jemand sagte, es ein Problem mit dem IP-Variable sein könnte:

static char* getip(struct sockaddr_storage client_addr) { 
    char ipstr[20]; 
    struct sockaddr_in *s; 


    s = (struct sockaddr_in *) &client_addr; 

    /** 
    * Converts network address (s) in the IPV_4 family into a string. 
    */ 
    return strdup(inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr)); 
} 
+1

Sind Sie sicher, dass die Datentypen übereinstimmen? Ansonsten haben Sie ein undefiniertes Verhalten. –

+7

Bitte post [MCVE] (https://stackoverflow.com/help/mcve) – vasek

+0

_Questions Debugging-Hilfe zu suchen (warum nicht dieser Code zu arbeiten?) Muss das gewünschte Verhalten umfasst, um ein bestimmtes Problem oder Fehler und den kürzesten Code erforderlich um es in der Frage selbst zu reproduzieren. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: a [MCVE] ._ –

Antwort

7

Ich denke, dass das Problem von row kommt welches ein \r Zeichen enthält.

ändern Sie es einfach mit strchr(...)

/* replace all '\r' by 'R' in row */ 
char *p = strchr(row, '\r'); 
while(p) 
{ 
    *p = 'R'; 
    p = strchr(row, '\r'); 
} 
+0

Wenn ich das verwende, druckt das Programm nichts. Muss ich noch etwas tun? – gel

+0

@alain Ich vermisse eine Zeile zu schreiben, korrigiert. – purplepsycho

+0

Ich denke, Sie sind in der Tat richtig, aber ich würde '\ r' für '\ n' ändern. Ich denke, das war die beabsichtigte Verwendung? – Girauder

Verwandte Themen