2011-09-19 2 views
0

Я хочу сохранить локальное время для переменной char. вот код, который я использовал. но он говоритсохранение системного времени переменной в cpp

"не может преобразовать символ * на символ"

Вот мой код:

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

Thanx заранее.

+0

Следует иметь в виду, что '_strtime' является функцией Windows, предоставляя фрагмент кода нестандартно. Просьба рассмотреть использование 'const time_t current = time (NULL); strftime (timeStr, 9, "% H:% M:% S", localtime (& current)); ', даже если это выглядит как несколько, потому что это делает ваш код ненужным в зависимости от (устаревшей) функции только для Windows , – DevSolar

ответ

0

Это просто, у вас есть массив символов timeStr длины 9 и пытается присвоить его char intime. Там тип несовместимости. Думаю, что char[] никогда не равен char.

Вы могли бы решить эту проблему следующим образом (но я не знаю, что вы хотите достичь):

struct tme 
{ 
    char* intime; 
}e; 

PS: MSDN утверждает, что (_strtime):

// Примечание: _strtime устарел; рассмотреть вопрос об использовании _strtime_s вместо

0
e.intime=timeStr; 

timeStr имеет тип char [9]. Он распадается на указатель, указывающий на первый элемент во время назначений или в вызове функции, используемом в качестве параметра.

e.intime имеет тип char. char и char* не совместимы с типом, и компилятор вам жалует. Вместо этого вы можете сделать -

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

Теперь, strcpy можно использовать для копирования времени на переменную-член.

strcpy(e.intime, timeStr); 

Если это C++, используйте зЬй :: строка вместо сырых массивов.

+0

Размер буфера 9: шесть цифр, два двоеточия и нулевой символ. –

+0

Если этот дополнительный символ окончания требуется, то он небезопасен (поскольку timeStr не будет иметь завершающий нуль, поэтому 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()); 
} 
Смежные вопросы