2017-01-17 67 views
-1

私はまだCのプログラミングには本当に新しいので、私に同行してください。私はこのコードを実行すると:Cプログラムの "ctime"の後に改行を削除するには?

#include <time.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(void) 
{ 
    while (1) { 
     time_t mytime; 
     mytime = time(NULL); 
     printf("%s Hello world\n", ctime(&mytime)); 
     sleep(1); 
    } 
    return 0; 
} 

を出力は常に次のようになります。私が欲しいもの

Wed Jan 18 02:32:32 2017 
Hello world 
Wed Jan 18 02:32:33 2017 
Hello world 
Wed Jan 18 02:32:34 2017 
Hello world 

は、このようなものです:

Wed Jan 18 02:32:32 2017 Hello world 
Wed Jan 18 02:32:33 2017 Hello world 
Wed Jan 18 02:32:34 2017 Hello world 

はどのように私はそれを行うことができますか?

注:私はprintf("%s Hello world\n", ctime(&mytime));から\nを削除した場合 それは次のようになります:

Wed Jan 18 02:38:29 2017 
Hello worldWed Jan 18 02:38:30 2017 
Hello worldWed Jan 18 02:38:31 2017 
Hello worldWed Jan 18 02:38:32 2017 
Hello worldWed Jan 18 02:38:33 2017 
+0

OPは、* 'Hello World'の前に改行を必要としません。希望の出力には後のものが含まれます。 –

+0

'ctime'の代わりに' strftime'を使います。 –

+0

あなたは私が間違っている、私のポストをもう一度見てください – hillz

答えて

3

ctime機能は改行で終わる文字列へのポインタを返します。 man pageから

コールctime(t)asctime(localtime(t))と同等です。それはあなたが改行したくない場合は、保存する必要があります「\ nは1993年21時49分08秒水6月30日」

フォーム のNULLで終わる文字列へ カレンダー時刻tを変換し、ポインタを付けて、改行を削除してから印刷してください。

char *t = ctime(&mytime); 
if (t[strlen(t)-1] == '\n') t[strlen(t)-1] = '\0'; 
printf("%s Hello world\n", t); 
+0

しかし' \ n'と決して異なるシステム間で '\ r \ n'であることは保証されていますか? – Havenard

+1

@Havenardはい、C標準では、上記の 'ctime'と' asctime 'と 'asctime'の出力形式との間の同等性についても述べています。 – dbush

+0

合理的です。しかし、なぜt [strlen(t)-1] == '\ n''のためのテストは?コードが ''\ n''がバッファを終了することを確信していなければ、'' \ n''が存在していても、 '\ 0''で始まる不正な文字列は' t [strlen(t)-1] 'である。 – chux

3

使用strftimeあなた自身の文字列をフォーマットする:問題のような簡単な書式設定タスクの場合

#include <stdio.h> 
#include <time.h> 

int main(void) 
{ 
    char buf[100]; 
    strftime(buf, 100, "%a %b %d %T %Y", localtime(&(time_t){time(NULL)})); 
    printf("%s Hello world\n", buf); 
} 

を、あなた自身printfを惜しまとstrftimeは、すべての作業やらせることができます。

strftime(buf, 100, "%a %b %d %T %Y Hello world\n", 
      localtime(&(time_t){time(NULL)})); 
    fputs(buf, stdout); 

また、戻り値strftimeを確認する必要があります。ゼロは失敗を示している可能性があります。

+0

[デモ](http://ideone.com/b5Nnlt) –

+0

'ctime()'の静的バッファを使いこなすよりも、より適切な解決策のように見えます。 – Havenard

+0

@Havenard '"%a%b%d%T%Y "'はロケールに依存しますが、 'ctime()'はそうではありません。 – chux

0

herefgets()の後に提案されているように、人気の方法で'\n'を削除してください。 '\n'がない場合でも問題はありません。

char * ct = ctime(&mytime)); 
ct[strcspn(ct, "\n")] = '\0'; 
printf("%s Hello world\n", ct); 

ctime()名目C仕様が他のその正常範囲、結果にあるstruct tmフィールド値についての修飾子を有する次の例形

Sun Sep 16 01:03:52 1973\n\0 

static char some_name[26];へのポインタを返しますUBです。 という数字がの範囲にないという考え方に従えば、これは'\n'の固定配置に問題があります。

関連する問題