Учитывая ограничение вашей задачи (не std::string
, нет std::vector
, динамическое распределение памяти) , Я постараюсь дать вам модифицированную, но рабочую версию вашего кода.
Моей идеей является прочитанное слово словом мое слово и остановка, когда он достигнет EOF или \ n. Не могли бы вы указать на ошибку?
Поскольку мольбднило указал (c!=EOF) || (c!='\n')
, это всегда верно, поэтому ваша петля никогда не кончится.
Как вы заметили, ваш буфер длиной всего 1 символ, и вы не проверяете переполнение, кроме того, вы забыли добавить нулевой терминатор в конце его.
Ваш второй вопрос о том, что произойдет, когда new
не может выделить достаточное количество памяти. Ну, это генерирует исключение, которое ваша программа должна поймать, чтобы управлять ситуацией, но самое лучшее (а не единственное на самом деле, может быть, самое легкое), которое вы можете сделать, это прекратить вашу программу.
Это пример того, как выполнить задание с учетом вышеуказанных ограничений:
#include <iostream>
using namespace std;
const int INITIAL_SIZE = 8;
int main() {
// the following block of code could rise an exception
try
{
int n = 0;
char c;
// allocate some memory to store the null terminated array of chars
char *a = new char[INITIAL_SIZE];
// what happens if new fails? It throws an exception of type std::bad_alloc
// so you better catch it
int allocated = INITIAL_SIZE;
// read a charachter from stdin. If EOF exit loop
while(cin.get(c))
{
// If it's a newline or a carriage return stop
if('\n' == c || '\r' == c)
//^ note that ^^^ putting the literals first helps avoiding common
// error like using "=" instead of "==" in conditions
break;
a[n] = c;
// if the array is full it's time to reallocate it
if (n == allocated)
{
// There are alternatives, of course, but I don't know which library
// you are allowed to use, so I assume no one and BTW your compiler
// could be smart enough to recognize the pattern and optimize it
// allocate a bigger array
allocated *= 2;
char *b = new char[allocated];
// copy the old one in the new one
for (int i = 0; i <= n; ++i)
{
b[i] = a[i];
}
// release the memory handled by the old one...
delete[] a;
// but keep using the same pointer. Just remember not to delete b
// so that a allways points to allocated memory.
a = b;
}
// a new character has been succesfuly added
++n;
}
// now before using a, we have to add the null terminator
a[n] = '\0';
// note that a doesn't contain the '\n'
cout << a << '\n';
delete[] a;
// normal program termination
return 0;
}
// If new fails to allocate memory a std::bad_alloc exception is thrown
catch (const exception &e)
{
cout << "Exception caught: " << e.what() << "\nProgram terminated.\n";
return -1;
}
}
В C++ используется класс строки для этого. – Donnie
Естественным способом в C++ было бы использование 'std :: string' и' getline' или '>>' для чтения в строку. В противном случае вам нужно будет перераспределять и копировать в более крупный массив. – crashmstr
Вы конкретно пытаетесь не использовать стандартные библиотечные инструменты 'std :: string' и' getline'? –