Угу ... так если поставить char buff[9], то проблема все ровно остается, в конце добавляются какие-то символы
Code: #include <string.h> #include <stdio.h> void main() { char buff[3]; char new_buff[3]; memset(buff, 0, sizeof(buff)); memset(new_buff, 0, sizeof(new_buff)); strcpy(buff, "11.11.11"); strncpy(new_buff, buff, 2); printf("%s", new_buff); Так работает. И так тоже: Code: void main() { char buff[3]; memset(buff, 0, sizeof(buff)); strcpy(buff, "11.11.11"); strncpy(buff, buff, 2); buff[2] = '\0'; printf("%s", buff); А вообще делай buff больше, так как ты затираешь данные после 3 байт.
В смысле есть структура, в которой больше одного поля. Нам эту структуру надо передать функции, в функции с ней что-то сделать, ну это не суть, а потом эту структуру каким-то образом вернуть из функции по полям, то есть можно одно поле вернуть через return, а вот остальные другие поля как вернуть не представляю понятия. В общем суть в том, как из функции вернуть больше одного значения, то есть сразу все значения полей.
в чем проблема записать изменения в ту же структуру, или в другую? ниже показаны оба способа. Code: #include <iostream> struct Point { int x; int y; }; void zero_point(Point &p) { p.x = 0; p.y = 0; } void copy_incremented_point(const Point &src, Point &dest) { dest.x = src.x + 1; dest.y = src.y + 1; } int main() { Point a; Point b; zero_point(a); std::cout << a.x << ':' << a.y << std::endl; copy_incremented_point(a, b); std::cout << a.x << ':' << a.y << std::endl; std::cout << b.x << ':' << b.y << std::endl; return 0; }
В c++ помощью gdi+ на VS 2010 делаю скриншот экрана и сохраняю через функцию bitmap.Save Code: GetEncoderClsid(L"image/jpeg", &clsid); bitmap.Save("D:\\screen.jpeg", &clsid); Каким образом в имя файла вставить время и дату? Например 16_00_31_26_06_13_screen.jpg/ Получил нужное имя Code: char buffer[30]; SYSTEMTIME time; GetLocalTime(&time); sprintf(buffer,"\r\n%02d_%02d_%d %02d_%02d_%02d.jpg",time.wDay, time.wMonth,time.wYear,time.wHour,time.wMinute,time.wSecond); Но компилятор ругается Code: error C2664: Gdiplus::Status Gdiplus::Image::Save(const WCHAR *,const CLSID *,const Gdiplus::EncoderParameters *): невозможно преобразовать параметр 1 из "char [30]" в "const WCHAR *"
Если в Visual Studio, то как-то так: Code: WCHAR buffer[30]; SYSTEMTIME time; GetLocalTime(&time); swprintf(buffer, L"%02d_%02d_%d %02d_%02d_%02d.jpg", time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute, time.wSecond);
кстати вместо этого ахтунга лучше использовать boost::format ну или на крайняк Code: HRESULT StringCchPrintf( LPTSTR pszDest, size_t cchDest, LPCTSTR pszFormat, ... ); из strsafe.h а то когда нибудь нарвётесь...
Можно и без буста хорошо и безопасно отформатировать стандартной библиотекой, std::stringstream + iomanip. Я просто привел максимально простой сишный код по образцу автора.
можно но я не люблю форматировать через iomanip наверное сказывается сишный опыт привык к printf манипуляторам... поэтому и посоветовал из этой же серии... кстати я вот буквально вчера использовал boost::format для сборки сложных пакетов и случилось так что аргументов добавил или убавил уже не помню а спецификаторы в строке формата забыл поправить так boost::format тут же кинул исключение что количество спецификаторов не соответствует числу аргументов... а sprintf просто отнял бы время на исправление бага...