C ++ Char без ограничений - PullRequest
       35

C ++ Char без ограничений

4 голосов
/ 29 апреля 2010

Я довольно хорошо разбираюсь в C #, но я решил, что было бы неплохо также изучить C ++. Единственное, что я не могу понять, это символы. Я знаю, что вы можете использовать строку lib, но я также хочу выяснить символы.

Я знаю, что вы можете установить символ с таким лимитом:

#include <iostream>
using namespace std;

int main()
{
   char c[128] = "limited to 128";
   cout << c << endl;
   system("pause");
   return 0;
}

Но как бы я сделал чар без лимита? Я видел символы с *, но я думал, что это было для указателей. Любая помощь с благодарностью.

Ответы [ 5 ]

6 голосов
/ 29 апреля 2010

Вы не можете иметь массив без ограничений. Массив занимает место в памяти, и, к сожалению, нет такой вещи, как безграничная память.

По сути, вам нужно создать массив определенного размера и написать логику, чтобы расширить размер массива, если вам нужно больше места (и, возможно, уменьшить его, если вам нужно меньше места).

Это то, что std::string и std::vector делают для вас под капотом.

2 голосов
/ 29 апреля 2010

Вы можете использовать vector из char.

0 голосов
/ 29 апреля 2010
Массивы

C / C ++ char примерно идентичны char*. Тот же блок кода можно переписать так:

int main()
{
   char* c = "limited to 128";
   cout << c << endl;
   system("pause");
   return 0;
}

Компилятор сгенерирует для вас строку с нулевым символом в конце, которую вы можете использовать в своем коде. Динамический способ сделать это - использовать malloc или operator new [].

char* str = malloc(sieof(char) * requiredlength); //C-compatible

OR

char* str = new char[requiredlength];
0 голосов
/ 29 апреля 2010

Для структуры данных требуется выделенная память.

Некоторые структуры данных (например, строка или вектор символов) имеют внутреннюю логику в своем классе, которая динамически распределяет память по мере необходимости.

Массивы (которые приходят из C) не нужны - вам нужно выделить память для них вручную, статическим способом (char c [128]), как это делается в вашем примере, или динамически во время выполнения через malloc () и company. Конечно, сделать правильное динамическое распределение / перераспределение не очень просто, и зачем вообще делать это, когда уже есть классы (например, string), которые делают это для вас правильным способом? :)

0 голосов
/ 29 апреля 2010

std :: string - хорошая реализация вектора символов chars:)

...