Что такое завершенная пустым указателем строка?

Как делает это отличается от станд.:: строка?

23
задан SymbolixAU 16 November 2017 в 09:34
поделиться

5 ответов

Нулевая строка - это непрерывная последовательность символов, последний из которых имеет двоичный битовый паттерн, состоящий из всех нулей. Я не уверен, что вы имеете в виду под "обычной строкой", но если вы имеете в виду std::string, то std::string не требуется (до C++11), чтобы быть связанной, и не требуется наличие терминатора. Кроме того, строковые данные std::string всегда выделяются и управляются содержащим их объектом std::string; для нулевой строки такого контейнера нет, и вы обычно ссылаетесь и управляете такими строками с помощью пустых указателей.

Все это действительно должно быть освещено в любом приличном учебнике по Си++ - я рекомендую взять Ускоренный Си++, один из лучших.

43
ответ дан 29 November 2019 в 00:36
поделиться

Существует два основных способа представления строки:

1) Последовательность символов с нулевым (нулевым) символом ASCII, 0 в конце. Вы можете узнать, сколько это длится, поискав терминатор. Это называется строкой с нулевым символом в конце или иногда с нулевым символом в конце.

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

Я не уверен насчет «обычной строки», но довольно часто случается, что, говоря о конкретном языке, слово «строка» используется для обозначения стандартного представления для этого языка. Итак, в Java java.lang.String - это строка типа 2, что означает «строка». В языке C «строка», вероятно, означает строку типа 1. Стандарт довольно многословен, чтобы быть точным, но люди всегда хотят опустить то, что «очевидно».

В C ++, к сожалению, оба типа являются стандартными. std :: string - это строка типа 2 [*], но стандартные библиотечные функции, унаследованные от C, работают со строками типа 1.

[*] На самом деле std :: string часто реализуется как массив символов с отдельным полем длины и нулевым ограничителем. Таким образом, функция c_str () может быть реализована без необходимости копировать или перераспределять строковые данные. Я не могу вспомнить, законно ли реализовать std :: string без хранения поля длины: вопрос в том, какие гарантии сложности требуются стандартом. Для контейнеров в целом size () рекомендуется равным O (1), но на самом деле это не обязательно. Так что, даже если это законно, реализация std :: string, в которой используются только нулевые терминаторы, будет удивительной.

16
ответ дан 29 November 2019 в 00:36
поделиться

Нулевая строка означает, что конец вашей строки определяется через появление null-char (все биты равны нулю).

"Другие строки", например, должны хранить свою собственную длину.

3
ответ дан 29 November 2019 в 00:36
поделиться

А «строка» - это действительно просто массив Char ; NULL-TRAINIDED - это тот, где нулевой символ «\ 0» отмечает конец строки (не обязательно конец массива). Все строки в коде (разграниченные двойными кавычками "" ) автоматически расторгуты от компилятора.

Так, например, «HI» совпадает с {'H', «I», '\ 0'} .

-121--1586144-

Строка расточина NULL - это встроенный формат строки в C. String Littleals, например, реализован как NULL-завершается. В результате целый много кода (библиотека времени работы C, для начала) предполагает, что строки расторгнуты NULL.

1
ответ дан 29 November 2019 в 00:36
поделиться

, поскольку вы даете функцию на сертификацию в этой форме, функция выполняется, а не передается на сертификат. У вас есть три альтернативы, чтобы сделать его работать:

Дайте первой функции, затем время ожидания и параметры в качестве последних аргументов:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

или просто напишите строку, которая будет оценена:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout);

третий стиль - пройти Анонимная функция, которая вызывает функцию. Обратите внимание, что в этом случае вы должны сделать это в закрытии, чтобы предотвратить изменение значений в цикле, поэтому он становится немного сложно:

(function(u, p, t) {
    setTimeout(function() { doRequest(u, p); }, t);
})(url, proxys[proxy], proxytimeout);

Второй формат немного взлом, но тем не менее работает, если аргументы скалярные Значения (строки, ints etc). Третий формат немного неясен, поэтому в этом случае первый вариант, очевидно, будет работать лучше для вас.

-121--2412231-

А «строка» на самом деле просто массив CHAR ; Строка расточины NULL, где нулевой символ '\ 0' отмечает конец строки (не обязательно конец массива). Все строки в коде (разграниченные двойными кавычками «) автоматически расторгуты от компилятора.

Так, например, «HI» такой же, как {'h', 'i', '\ 0'} .

70
ответ дан 29 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: