Получение длины символа строкового литерала

Как бы вы получили длину (Give или take null-terminator) строкового литерала без использования cstdlib чего-то вроде этого:

char* foo = "foobar";
cout << sizeof(foo) << endl; //Always outputs 4
cout << sizeof(*foo) << endl; //Always outputs 1

Я должен перегрузить оператор + для строки, которая может / не может включать строковые литералы в конкатенации. У меня нет способа выделить память для строки, не зная длины передаваемого char * (или char [], я думаю).

1

Решение

foo — указатель на строку. Да, это постоянная строка, но она все еще char* в конце дня.

В частности, размер указателя на символ (foo) составляет 4 байта (в 32-битной системе [ну, в системе с 4-байтовыми указателями]) и размер символа (*foo) составляет 1 байт.

Нет (стандартного) способа узнать длину строки, когда вы используете указатель на строковый литерал.

Однако вы можете узнать размер, когда используете массив:

char foo[] = "some string";
size_t len = sizeof(foo) - 1;
3

Другие решения

#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;
}
3

sizeof (char *) — размер указателя на строку.
ты можешь попробовать

char foo[] = "foobar";

sizeof (foo) = 7 (потому что это «foobar \ 0» — строка с нулевым символом в конце)

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)

Я не удивлюсь, если вы найдете длину строки там.

0

использование std::string:

#include <string>

int main()
{
std::string str("Hello World");

std::cout << str.length(); // 11
}
-1
По вопросам рекламы [email protected]