#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
char buf[1500]{"HTTPS/1.1 200 OK\nContent-Type: \
application/json; charset=utf-8\n\
Content-Length: 48\
Connection: Close{\"DATA\": {\"ERROR\":\
\"ANY USER IS LOGIN\"}}"};
auto bs{ find(begin(buf) , end(buf) , '{' ) };
auto es{ find(rbegin(buf), rend(buf) , '}' ) };
copy(bs, es.base(), ostream_iterator<char>(cout));
}
{"DATA": {"ERROR": "ANY USER IS LOGIN"}}
class Point
{
double x_coord;
double y_coord;
public:
Point(double x = {}, double y = {}) : x_coord{x}, y_coord{y}
{
}
};
class Square
{
Point* center_pt;
double size;
public:
Square(double x = {}, double y = {}, double sz = {1})
: center_pt{new Point(x / sz, y / sz)}, size{sz}
{
}
~Square(){ delete center_pt; }
};
int main()
{
Square sq(10, 10, 2);
Square sq2();
}
void swap(int& a, int& b)
{
int c = a;
a = b;
b = c;
}
где можно дополнительно почитать
protected:
char* Str; // first
int Length; // second
String::String(const char* ptr)
: Str(new char[strlen(ptr) + 1]), Length(strlen(ptr) + 1)
{
strcpy(Str, ptr);
}
String::String(const String& t)
: Str(new char[t.Length]), Length(t.Length)
{
strcpy(Str, t.Str);
}
protected:
int Length; // first
char* Str; // second
только символы '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'A, 'B', 'C', 'D', 'E', 'F'.
//...
struct hex_str_traits
{
static bool is_hex_chars(const char* s)
{
auto size{ strlen(s) };
for (auto idx{ 0 }; idx < size; ++idx)
{
if (!in_range(s[idx], '0', '9') && !in_range(s[idx], 'A', 'F'))
return false;
}
return true;
}
static bool in_range(const int& value, const int& a, const int& b)
{
return a <= value && value <= b;
}
};
//...
class hex_string : public String
{
//...
public:
hex_string(const char* s);
//...
};
//...
hex_string::hex_string(const char* s)
: String( (hex_str_traits::is_hex_chars(s) ? s : "") )
{
}
//...
С чем это связано? Недоработка разработчиков?
#include<iostream>
#include<vector>
using namespace std;
template<typename T>
class Matrix
{
size_t cols;
size_t rows;
vector<vector<T>> m_matrix;
public:
Matrix(size_t c, size_t r) : cols{c}, rows{r}, m_matrix{}
{
m_matrix.reserve(cols);
for(auto i{0}; i < cols; ++i)
{
m_matrix.emplace_back(vector<T>(rows));
}
}
auto begin()
{
return m_matrix.begin();
}
auto end()
{
return m_matrix.end();
}
vector<T>& operator[](size_t i)
{
return m_matrix[i];
}
//...
};
int main()
{
Matrix<int> m(10,10);
m[5][5] = 5;
for(auto& c : m)
{
for(auto& e : c)
{
cout << e << ' ';
}
cout << endl;
}
return 0;
}
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 5 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
char first_name[40] - резервируется память для 40 байт.
typedef char * string;
string first_name; - это просто указатель, причем неинициализированный.
scanf("%s %s", first_name, last_name); - это обращение
к неинициализированному указателю (undefined behaviour)
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using std::ofstream;
using std::vector;
using std::string;
using std::cout;
using std::cin;
using std::endl;
class Sport
{
vector<Sport> Sp;
char team;
double bal;
unsigned mesto;
string name;
public:
Sport(string _name = {}, char _team = {}, double _bal = {},
unsigned _mesto = {}, vector<Sport> sp = {})
: name {_name}, team{_team}, bal{_bal},
mesto{_mesto}, Sp{sp} {}
private:
friend ofstream& operator<<(ofstream& ofs, Sport& sp);
};
ofstream& operator<<(ofstream& ofs, Sport& sp)
{
ofs << sp.name << ' ';
ofs << sp.team << ' ';
ofs << sp.mesto << ' ';
ofs << sp.bal << ' ';
ofs << endl;
for(auto& p : sp.Sp)
{
ofs << p;
}
return ofs;
}
void writeSportsTo(const char* filename, Sport& sp)
{
ofstream of(filename);
if(of)
{
of << sp;
of.close();
}
}
int main()
{
constexpr char* filename = "C:\\sports.txt";
Sport sp;
writeSportsTo(filename, sp);
return 0;
}
#pragma once
#include <iostream>
template<typename T>
class TypeSize
{
public:
TypeSize(T v) : value{ v } {};
~TypeSize() {};
void dataTypeSize();
protected:
T value;
};
template<typename T>
void TypeSize<T>::dataTypeSize()
{
std::cout << "size: " << sizeof(value) << std::endl;
}
#pragma once
#include <typeinfo> // std::typeid()
#include "TypeSize.h"
template<typename T>
class TypeInfo : public TypeSize<T>
{
public:
TypeInfo(T v) : TypeSize<T>(v) {};
~TypeInfo() {};
void showTypeInfo();
};
template<typename T>
void TypeInfo<T>::showTypeInfo()
{
std::cout << "type: " << typeid(this->value).name() << std::endl;
}
#include "TypeInfo.h"
int main()
{
int a{ 5 };
TypeInfo<int> infInt(a);
infInt.dataTypeSize();
infInt.showTypeInfo();
std::getchar();
}
const char* data;
while((data = ether.tcpReply()) != NULL)
{
Serial.println(static_cast<String>(data));
}
С:\\Projects\\myProject\\Debug\\file.txt == ..\\debug\\file.txt
С:\\Projects\\myProject\\Release\\file.txt == ..\\release\\file.txt
С:\\Projects\\myProject\\Other\\file.txt == ..\\other\\file.txt
С:\\Projects\\myProject\\file.txt == ..\\file.txt
...
fopen("..\\file.txt", "r")
Мне нужно чтобы при передаче файла не нужно было писать какой либо длинный путь, а просто можно было бы передать имя файла.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
char* get_file_path(char* dir, char* fname)
{
dir = _getcwd(dir, MAX_PATH);
strcpy(&dir[strlen(dir)], "\\");
strcpy(&dir[strlen(dir)], fname);
return dir;
}
int main(int argc, char* argv[])
{
/* uncomment
if(argc != 1)
{
printf("error: usage myapp.exe file.txt\n");
return -1;
}
uncomment */
char dir[MAX_PATH];
char* file = "file.txt";//test
char* full_file_name = get_file_path(dir, file);// get_file_path(dir, argv[0])
FILE* fp = fopen(full_file_name, "r");
if(fp)
{
printf("Open\n");
fclose(fp);
}
printf("%s", full_file_name);
free(full_file_name);
return 0;
}
if(p->RoomsCount==p->ptr->RoomsCount) // ptr == nullptr;
struct OLS
{
int RoomsCount;
int floor;
float square;
OLS *ptr;
friend bool operator==(OLS& a, OLS& b);
};
typedef OLS* pOLS;
bool operator==(OLS& a, OLS& b)
{
return (a.RoomsCount == b.RoomsCount) &&
(a.floor == b.floor) &&
(a.square != b.square);
}
void CompAndFind(pOLS& str)
{
if(!str) return;// nullptr
pOLS p = str;
while(p->ptr)
{
if(*p == *(p->ptr))
{
show(p);
}
p = p->ptr;
}
}
знать профессионал
что нужно сделать или прочитать перед тем как начать программировать-> -> ->
начать думать как программист
Поиски литературы почему-то не увенчались успехом, пара унылых статей на хабре, море старой литературы старше 15 лет и курсы для новичков на udemy где описывается разница между insert и select.