Простые общие вопросы о C ++ - PullRequest
0 голосов
/ 01 мая 2011

Я перешел из autoit и сейчас изучаю C ++, и некоторые проблемы продолжают возникать.

Первая - сохранение ввода символов.Проблема в том, что я понятия не имею, сколько символов в этой строке файла (если вы читаете файл) или сколько букв будет набирать пользователь (в консольном приложении).

Чтолучший способ подойти к этой проблеме ??Я слышал о строковом классе, но я хочу избежать его, потому что я не знаю, как он работает, и это приводит к уязвимости и т. Д.

Во-вторых ...

В C вы можете загрузить шеллкодв память, создайте указатель на функцию и выполните этот код.Есть ли какой-либо механизм для этого в C ++ ???

В-третьих ...

Как интерпретатор выполняет итерацию по массивам символов для вывода строки ???(char array [3];) Отслеживает ли компилятор размер массива или просто продолжает чтение из памяти, пока не достигнет этой \ 0 вещи ???

И наконец ...

Если Char * - это просто указатели на данные в памяти, то почему:

char * title = "Заголовок программы";

эта работа ???где строковый литерал хранится в памяти ??как на него ссылаются ???

Спасибо большое.Я очень ценю вашу помощь.

-Hyperzap

Ответы [ 2 ]

2 голосов
/ 01 мая 2011
  1. Трата вашего времени на изучение std :: string стоит своих усилий, так как она доставляет вам много хлопот. Если вы не хотите использовать возможности C ++, тогда зачем использовать C ++, а не только C?
  2. Для этого вы можете использовать тот же код, что и в C.
  3. Да, вывод iostream строк в стиле C выводится до нулевого конца. Еще раз, если вы используете std :: string, вам не нужно заботиться о таких деталях.
  4. Поправьте меня, если я ошибаюсь, но я думаю, что title будет const char[], сохраненным в стеке.

Пример:

const char* hello = "Hello\0World";
cout << hello; // Prints only "Hello", i.e. up to terminating zero (\0)

Причина, по которой это работает:

const char* hello = "Hello world";
cout << hello;

потому что hello - это на самом деле "Hello world\0"; - другими словами, компилятор вставляет завершающий ноль.

Обратите внимание, что std::string не делает никакой магии. Он также читает до конечного нуля:

string hello = "Hello\0World\n";
cout << hello; // Still only gives "Hello"
0 голосов
/ 01 мая 2011

char* title = "String Literal" работает, потому что компилятор предварительно выделяет область памяти для хранения вашего строкового литерала, таким образом, вы затем возвращаете указатель на эту область памяти. В c ++ - массив, для которого вы знаете размер во время компиляции (как в вашем примере: char array[3] - это сам по себе тип, поэтому компилятор отслеживает размер. Однако, если вы не знаете размер (т.е. . char array[]), это просто указатель на char. Однако вы должны использовать std::vector в c ++ (для большей безопасности и производительности). Я не слишком уверен в твоих двух других вопросах (не совсем понял их)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...