Вход

Просмотр полной версии : [Вопрос] Узнать длину значения константы (если строка)



franked
18.02.2016, 00:22
Ребят,как я понял нельзя узнать длину строки константы? Сколько не пробовал,получал одну и ту же ошибку. Если можно,поделитесь как :thank_you::hi:

ziggi
18.02.2016, 00:26
const string[] = "abcd";
printf("Длина строки: %d", sizeof(string));
printf("Длина строки: %d", strlen(string));

$continue$
18.02.2016, 00:38
Не очень, корректно, использовать sizeof в данном случии.



printf("Длина строки: %d", sizeof(string));

ziggi
18.02.2016, 01:22
Не очень, корректно, использовать sizeof в данном случии.

Почему? Если строка объявлена так, как объявил я, то вполне корректно.

franked
18.02.2016, 11:44
Ой..,забыл упомянуть,константы типа #define,вот тут уж точно нельзя,да?:mda:

P.S благодарен,что не прошли эту тему стороной!

MacMailler
18.02.2016, 12:43
Можно.

#define TEST1 Пример строки №1.
#define TEST2 "Пример строки №2."
printf("TEST1:%i", strlen(""#TEST1""));
printf("TEST2:%i", strlen(TEST2));

Daniel_Cortez
18.02.2016, 13:02
Почему? Если строка объявлена так, как объявил я, то вполне корректно.
Тогда в первом варианте должно быть не "длина строки", а "размер строки" или "размер массива", т.к. это не одно и то же.



Ребят,как я понял нельзя узнать длину строки константы? Сколько не пробовал,получал одну и ту же ошибку. Если можно,поделитесь как :thank_you::hi:


static const str_0[] = "Sample text";
printf("text: %s, length: %d", str_0, sizeof(str_0)-1);

Как-то так, берём размер строки и вычитаем 1 ячейку, отведённую под символ конца строки (нуль-символ).
Но такой подход работает не во всех ситуациях. Например, в массив из 20 ячеек можно записать текст из 10 символов и будут заняты только 11 ячеек из 20 - тогда придётся использовать strlen. Здесь sizeof(str_0)-1 работает только потому, что компилятор сам рассчитывает минимальный размер массива, достаточный, чтобы вместить в него строку.

franked
18.02.2016, 14:27
Отлично! Всем большое спасибо за ответы! :good: Вот только еще такой вопрос...

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


stock MyFunc(playerid, id, text[] = "")//И по умолчанию она равняется пустому символу как бы
{
//Так вот,я бы хотел рассчитать внутри этой функции размер текста.
new testVar[10+sizeof(text)];//Вот примерно таким образом
}

И вот тут как раз меня не спасает не один из выше приведенных вариантов...




warning 224: indeterminate array size in "sizeof" expression (symbol "")






error 008: must be a constant expression; assumed zero
error 009: invalid array size (negative, zero or out of bounds)
error 036: empty statement
fatal error 107: too many error messages on one line

Вот кстати насчет ошибки


error 008: must be a constant expression; assumed zero

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


stock MyFunc(playerid, id, const text[] = "")

И все-равно,ошибки идентичные (такие же,что и выше описаны для этого спойлера)



Как я понял,это безвыходная ситуация? Получается так нельзя заполнить переменную никак? типа "динамическим" образом?

Daniel_Cortez
18.02.2016, 14:56
Отлично! Всем большое спасибо за ответы! :good: Вот только еще такой вопрос...

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


stock MyFunc(playerid, id, text[] = "")//И по умолчанию она равняется пустому символу как бы
{
//Так вот,я бы хотел рассчитать внутри этой функции размер текста.
new testVar[10+sizeof(text)];//Вот примерно таким образом
}

И вот тут как раз меня не спасает не один из выше приведенных вариантов...




warning 224: indeterminate array size in "sizeof" expression (symbol "")






error 008: must be a constant expression; assumed zero
error 009: invalid array size (negative, zero or out of bounds)
error 036: empty statement
fatal error 107: too many error messages on one line

Вот кстати насчет ошибки


error 008: must be a constant expression; assumed zero

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


stock MyFunc(playerid, id, const text[] = "")

И все-равно,ошибки идентичные (такие же,что и выше описаны для этого спойлера)



Как я понял,это безвыходная ситуация? Получается так нельзя заполнить переменную никак? типа "динамическим" образом?
Добавьте опциональный параметр size, в котором значением по умолчанию будет sizeof(string).

franked
18.02.2016, 15:34
Добавьте опциональный параметр size, в котором значением по умолчанию будет sizeof(string).

Точно! Как же я не догадался!:dash2: То есть получается выглядеть это все будет примерно так,как я понял? :



static Stringi[] = "Я тот самый текст,размер которого будет учитываться";
MyFunc(playerid, id, Stringi);//3ий параметр не обязателен,но я хочу его включить,4ый тоже не обязательный,хочу чтобы он сам посчитал
//Сама функция
stock MyFunc(playerid, id, text[] = "", size = sizeof(text))
{
new testVar[10+size];//Вот примерно таким образом?!
}

Я правильно понял? Если да,то все-еще та ошибка,только уже как с методом strlen:


error 008: must be a constant expression; assumed zero
error 009: invalid array size (negative, zero or out of bounds)
error 036: empty statement
fatal error 107: too many error messages on one line

Если нет, то будьте добры пожалуйста, показать,как в итоге примерно должна эта функция выглядеть?!

L0ndl3m
18.02.2016, 16:04
При использовании оператора sizeof необходимо предусмотреть, чтобы у проверяемого массива был ненулевой размер.
То есть, по умолчанию нельзя строку делать пустой.