Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2012, 10:30   #1
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию Скрипт на С - работа со строками

Среда разработки WinCC...
//получаю строку
Код:
s = GetTagChar("D_1"); //29.03.2012 10:12
//записываю дату и время
Код:
Start.wYear=//как записать сюда 2012, преобразовав через atoi
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 29.03.2012, 10:53   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Код:
	
Start.wYear = atoi( &s[6] );
?
EUGY вне форума Ответить с цитированием
Старый 29.03.2012, 10:58   #3
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Код:
	
Start.wYear = atoi( &s[6] );
?
а вот так не прокатит:
Код:
Start.wYear=atoi(&s[6]+&s[7]+&s[8]+&s[9]);
Start.wMonth=s[3]=='0'?atoi(&s[4]):atoi(&s[3]+&s[4]);
Start.wDay=s[0]=='0'?atoi(&s[1]):atoi(&s[0]+&s[1]);
Start.wDayOfWeek=0;
Start.wHour=s[11]=='0'?atoi(&s[12]):atoi(&s[11]+&s[12]);
Start.wMinute=s[14]=='0'?atoi(&s[15]):atoi(&s[14]+&s[15]);
Start.wSecond=0;
Start.wMilliseconds=0;
или atoi возвращает число до неизвестного символа:
Код:
Start.wYear=atoi(&s[6]);
Start.wMonth=s[3]=='0'?atoi(&s[4]):atoi(&s[3]);
Start.wDay=s[0]=='0'?atoi(&s[1]):atoi(&s[0]);
Start.wDayOfWeek=0;
Start.wHour=s[11]=='0'?atoi(&s[12]):atoi(&s[11]);
Start.wMinute=s[14]=='0'?atoi(&s[15]):atoi(&s[14]);
Start.wSecond=0;
Start.wMilliseconds=0;
Исходники программ - http:\\www.kort.3dn.ru

Последний раз редактировалось KORT; 29.03.2012 в 11:00.
KORT вне форума Ответить с цитированием
Старый 29.03.2012, 11:10   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

atoi - хочет видеть один единственный указатель на строку.
Если в строковом формате все значения из двух разрядов и год из четырех то:
Код:
	wYear = atoi(&s[6]);
	wMonth = atoi(&s[3]);;
	wDay = atoi(&s[0]);
	wHour = atoi(&s[11]);
	wMinute = atoi(&s[14]);
Да, atoi возвращает число до нецифрового символа.
EUGY вне форума Ответить с цитированием
Старый 29.03.2012, 11:14   #5
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Да, atoi возвращает число до нецифрового символа.
Спс за пост....проверить не мог, т.к. нет компилятора под рукой...
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 29.03.2012, 13:06   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Может проще будет так:
Код:
s = "29.03.2012 10:12"
sscanf(s, "%d.%d.%d %d:%d", &Start.wDay, &Start.wMonth, &Start.wYear, &Start.wHour, &Start.wMinute );
EUGY вне форума Ответить с цитированием
Старый 12.04.2012, 11:34   #7
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Продолжаем тему:
есть строчка (выделенная):
Код:
void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
char ss[256];
SYSTEMTIME stStart;
SYSTEMTIME stStop;
GetSystemTime(&stStop);
memcpy(&stStart, &stStop, sizeof(SYSTEMTIME));
sprintf(ss, "%02u.%02u.%04u", stStart.wDay, stStart.wMonth, stStart.wYear);
SetTagChar("D_1", ss);
SetPropChar(lpszPictureName,"I/O Field1","OutputValue",ss);
}
выводит следующее: 12. 4.2012
если заменю строчку на
Код:
sprintf(ss, "%02u.%02u.%04u", stStart.wDay >= 10 ? stStart.wDay : '0' + stStart.wDay, stStart.wMonth >= 10 ? stStart.wMonth : '0' + stStart.wMonth, stStart.wYear);
будет вот такой вид: 12.04.2012
Проверить не могу нет компилятора под рукой
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 12.04.2012, 12:15   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Хм. странно.
sprintf(ss, "%02u.%02u.%04u", stStart.wDay, stStart.wMonth, stStart.wYear);
Записывает в ss именно 12.04.2012.
У меня нет WinCC, не понимаю, что ответственно за вывод в другом формате.
'0' + stStart.wDay В си бессмысленно, точнее это сложит значение символа '0' равное 48 в десятичной системе со значением wDay.
Конкатенация строк осуществляется только через функцию char *strcat( char *strDestination, const char *strSource );
EUGY вне форума Ответить с цитированием
Старый 12.04.2012, 12:55   #9
KORT
Вот я и
Форумчанин
 
Аватар для KORT
 
Регистрация: 07.04.2007
Сообщений: 501
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Хм. странно.
sprintf(ss, "%02u.%02u.%04u", stStart.wDay, stStart.wMonth, stStart.wYear);
Записывает в ss именно 12.04.2012.
Вот и я читал про это, но на практике другое. Думаю вообще избавиться от нулей. Будет остановка машины, проверю без 0, ну если не устроит начальства, придется
Код:
sprintf(ss, "%02u.%02u.%04u", stStart.wDay >= 10 ? stStart.wDay : strcat('0',stStart.wDay), stStart.wMonth >= 10 ? stStart.wMonth : strcat('0',stStart.wMonth), stStart.wYear);
Исходники программ - http:\\www.kort.3dn.ru
KORT вне форума Ответить с цитированием
Старый 12.04.2012, 13:24   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

strcat('0',stStart.wDay) нельзя!
первым параметром должен быть буфер в котором записан символ '0' и имеющий дополнительное пространство для записи другой строки. И возвращает эта функция также указатель на строку, поэтому в формате надо "%s.%s.%04u"

Потести:
Код:
	char bx[3] = {};
	char bufDay[3] = {};
	char bufMonth[3]= {};
	if (stStart.wDay < 10)	bufDay[0] = '0';
	if (stStart.wMonth < 10)	bufMonth[0] = '0';
	
	strcat(bufDay, itoa(stStart.wDay, bx, 10));
	strcat(bufMonth, itoa(stStart.wMonth, bx, 10));

	sprintf(ss, "%s.%s.%04u",bufDay, bufMonth, stStart.wYear);

Хотя странно..
проверь тупо так.
SetTagChar("D_1", "01.03.2012");
SetPropChar(lpszPictureName,"I/O Field1","OutputValue", "01.03.2012");
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками Op1nG.Spark Помощь студентам 4 02.11.2011 07:10
Работа со строками prem1era Общие вопросы C/C++ 3 10.10.2011 14:33
Работа со строками в C++ telogrejka Помощь студентам 6 27.02.2011 20:32
работа со строками(с++) Vitalka Помощь студентам 2 23.12.2010 20:18
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19