2011-09-19 15 views
0

ローカル時間をchar変数に保存したい。ここに私が使用したコードがあります。しかし、それはここでシステム時間をcppの変数に格納する

を "charにchar *型を変換することはできません"

を言っている私のコードは次のとおりです。事前に

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

struct tme 
{ 
    char intime; 
}e; 
void main() 
{ 

    char timeStr [9]; 
_strtime(timeStr); 
    e.intime=timeStr; 
    printf("The current time is %s \n", timeStr); 
} 

ありがとう。

+0

'_strtime'はWindowsの機能であり、コードスニペットが非標準に準拠していることに注意してください。まずは 'const time_t current = time(NULL); (非推奨)Windows-only関数に依存しないようにするため、strftime(timeStr、9、 "%H:%M:%S"、localtime(&current)); 。 – DevSolar

答えて

0

これは簡単なことですが、文字配列の長さが9で、char intimeに割り当てようとしています。型の非互換性があります。 char[]は決してcharと等しくないと考えてください。次のように、この問題を解決することができます(ただし、私はあなたが達成したいのか分からない)

struct tme 
{ 
    char* intime; 
}e; 

PS:MSDNは(_strtime)と述べている:

//注:_strtimeは非推奨です。タイプchar [9]である代わりに

0
e.intime=timeStr; 

timeStr _strtime_sを使用することを検討してください。これは、代入中またはパラメータとして使用される関数呼び出し中に、最初の要素を指すポインタに減衰します。

e.intimeは、charです。 charchar*は型互換性がなく、コンパイラはあなたにそれを訴えています。代わりに、 -

struct tme 
{ 
    char intime[10]; // +1 for the termination character to play safe 
}e; 

今、strcpyを使用してメンバー変数に時間をコピーすることができます。それはC++の場合

strcpy(e.intime, timeStr); 

のstd ::文字列の代わりに、生の配列を使用しています。

+0

バッファサイズ9で十分です.6桁、2つのコロン、およびヌル文字です。 –

+0

余分な終了文字が必要な場合、それは安全ではありません(timeStrには終了nullがないため、strcpyは10文字以上を上書きする可能性があります)。しかし実際、strTimeはヌルで終了することが保証されているので、9文字で十分です。 – TonyK

+0

@TonyK - strcpyは、宛先に余分に余分なスペースがあるので上書きしません。 '\ 0'でソースがヒットするまで、ソースをコピーするだけです。 – Mahesh

0

洗練のいくつかの段階:

段階1:コードを修正します。

struct tme { 
    char * intime; // You had a type mismatch 
} e; 

int main() { // Don't use void main() 
    char timeStr [9]; 
_strtime(timeStr); 
    e.intime=timeStr; 
    printf("The current time is %s \n", timeStr); 
} 

問題がここにあります:あなたのstruct tmeはそれのために全力を尽くすために、そのため正しく行うには、外部の世界に頼っています。もし我々がメインでtimeStrを再利用したいのであれば? main以外の関数でこの構造体を使用し、範囲外の変数にe.intimeを設定するとどうなりますか?

詳細化:struct tmeは時間バッファを所有する必要があります。

struct tme { 
    char intime[9]; // Put the buffer here, not in main. 
} e; 

int main() { 
    _strtime(e.intime); 
    printf("The current time is %s \n", e.intime); 
} 

ここにはまだ問題があります。そのバッファは誰でも変更でき、構造は単なる受動的なものです。

詳細:データを非表示にしてオブジェクトをアクティブにします。

struct tme { 
    const char * set_time() { _strtime (intime); return intime; } 
    const char * get_time() const { return intime; } 
private: 
    char intime[9]; 
}; 

int main() { 
    printf("The current time is %s \n", e.set_time()); 
} 
関連する問題