2017-09-20 13 views
4

共通のログ形式でテキストを印刷しようとしています。printf() - 印刷順序が間違っています。個別に印刷するときに機能する

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

問題は、すべての注文が混ざってしまうことです。出力は次のとおりです。

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

私は(1511)が印刷されたばかりipだと思い。理由を知らない。

私はこのようにそれらを印刷するとき:

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); 

期待のようにそれは動作します:

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

私が何らかの理由でstatuscodeを追加するときに問題が始まるようです。私は理由を知りません。どんな助けもありがとうございます。私は問題がrowから来ていると思い

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

でそれを修正するには、あなたは、データ型が一致していることを確認していますか?それ以外の場合は、未定義の動作があります。 –

+7

投稿する[MCVE](https://stackoverflow.com/help/mcve) – vasek

+0

デバッグのヘルプを求める質問(このコードが動作しないのはなぜですか?)には、必要な動作、特定の問題またはエラー、必要な最短コードが含まれている必要があります質問自体にそれを再現する。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法._ –

答えて

7

:誰かがそれがIP変数に問題がある可能性があると述べたよう

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. 
} 

:ここ

は、私はprinft()を使う関数であります\r文字が含まれています。

だけstrchr(...)

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

私はこのプログラムを使っても何も印刷しません。私は何か他のことをする必要がありますか? – gel

+0

@alain私は修正した1行を書くことができません。 – purplepsycho

+0

あなたは本当に正しいと思いますが、 '\ r'を '\ n'に変更します。これは意図した使用だと思いますか? – Girauder

関連する問題