Как узнать, подошёл ли указатель к концу массива
Всем добра!
Имеется массив символов msg и указатель на него ptr. Массив заполняется через указатель. Есть ли какой-то способ узнать, не вышел ли указатель на пределы массива?
char msg[256];
char* ptr = msg;
void put_char(char ch) {
if (is_ptr_out())
ptr = msg;
*ptr++ = ch;
}
bool is_ptr_out() {
bool res = false;
// if (ptr за пределами массива)
// res = true;
return res;
}
UPDATE
Уточню вопрос - массив msg имеет конкретный размер, а данные могут приходить неизвестного размера, и не обязательно в конце будет символ \0. И смысл вопроса - как не залезть за пределы массива, наполняя его данными. К тому же заполняемый массив может иметь другой тип отличный от char, например uint16_t.
Ответы (1 шт):
Автор решения: NunOfIt
→ Ссылка
Можно вот так, но лучше не изобретайте колесо и используйте std::string
#include <string>
#include <iostream>
template<typename charT, size_t N>
class String {
size_t count;
charT msg[N + 1];
charT *ptr, *first, *last;
public:
String(): count(0) {
for(size_t i = 0; i <= N; ++i) { msg[i] = '\0'; }
last = &msg[N];
first = &msg[0];
ptr = first - 1;
}
bool push_back(charT c) {
if(count >= N) { return false; }
++ptr;
msg[count++] = c;
return true;
}
bool push_back2(charT c) {
if(++ptr >= last) { return false; }
++count;
*ptr = c;
return true;
}
charT* get_msg() { return first; }
size_t lenght() const { return count; }
charT* end() { return last; }
charT* begin() { return first; }
};
template<typename charT>
char print(charT* beg, charT* end) {
for(charT* it = beg; it < end; ++it)
std::wcout << static_cast<wchar_t>(*it);
return '\0';
}
int main() {
//s1
String<char, 2> s1;
std::cout << "s1:\n";
std::cout << s1.push_back2('a') << ' ';
std::cout << s1.push_back2('b') << ' ';
std::cout << s1.push_back2('c') << ' ';
std::cout << s1.push_back2('d') << '\n';
std::cout << s1.get_msg() << '\n';
std::cout << '\n';
// s2
String<char16_t, 2> s2;
std::cout << "s2:\n";
std::cout << s2.push_back2(u'a') << ' ';
std::cout << s2.push_back2(u'b') << ' ';
std::cout << s2.push_back2(u'c') << ' ';
std::cout << s2.push_back2(u'd') << '\n';
std::cout << print(s2.begin(), s2.end()) << '\n';
return 0;
}