Как бы вы получили длину (Give или take null-terminator) строкового литерала без использования cstdlib чего-то вроде этого:
char* foo = "foobar";
cout << sizeof(foo) << endl; //Always outputs 4
cout << sizeof(*foo) << endl; //Always outputs 1
Я должен перегрузить оператор + для строки, которая может / не может включать строковые литералы в конкатенации. У меня нет способа выделить память для строки, не зная длины передаваемого char * (или char [], я думаю).
foo — указатель на строку. Да, это постоянная строка, но она все еще char*
в конце дня.
В частности, размер указателя на символ (foo
) составляет 4 байта (в 32-битной системе [ну, в системе с 4-байтовыми указателями]) и размер символа (*foo
) составляет 1 байт.
Нет (стандартного) способа узнать длину строки, когда вы используете указатель на строковый литерал.
Однако вы можете узнать размер, когда используете массив:
char foo[] = "some string";
size_t len = sizeof(foo) - 1;
#include <cstring>
std::size_t length = std::strlen(foo);
редактировать если по какой-либо причине вы не можете использовать какие-либо библиотеки, тогда разверните свой собственный strlen. Например
// simple recursion
size_t mystrlen1(const char* str)
{
return (*str) ? 1 + mystrlen1(++str) : 0;
}
или же
// iteration
size_t mystrlen_iteration(const char* str)
{
size_t counter = 0;
for (;*str!=0; ++str) ++counter;
return counter;
}
sizeof (char *) — размер указателя на строку.
ты можешь попробовать
char foo[] = "foobar";
sizeof (foo) = 7 (потому что это «foobar \ 0» — строка с нулевым символом в конце)
Причина, по которой вы видите значения, которые вы получаете, очевидна:
foo
указатель, а указатели чаще всего имеют длину 4 байта. *foo
является символом и длиной в один байт. Если вы не можете использовать встроенную библиотеку, вы можете свернуть свою собственную:
function myStrlen(char* foo) {
int ii=0;
while(foo[ii]!='\0') ii++;
return ii;
}
У меня есть забавное представление, что большинство компиляторов записывают размер блока выделенной памяти, сохраняя значение в (указатель — 1) — это то, как free () знает, сколько памяти освободить. Я не знаю, является ли это универсально верным, и верно ли это для строковых констант, но я успешно использовал это в прошлом. Да, я хакер … В вашем случае я бы внимательно посмотрел на
*(((unsigned long int*)foo) - 1)
Я не удивлюсь, если вы найдете длину строки там.
использование std::string
:
#include <string>
int main()
{
std::string str("Hello World");
std::cout << str.length(); // 11
}