LINUX.ORG.RU

c++ длина переменного массива

 


0

1

Как узнать длину переменного масива(1аргумент терминала)
Что если в char argv будет \0 до того, как наступит настоящий конец строки.
Там же нельзя использовать EOF? и sizeof(argv)/sizeof(*argv)
неподходит, т.к. массив переменной длины (как я понимаю)
Как быть?
Заранее спасибо
*Да, книжку по программированию читаю, интернет гуглю, пока непомогает



Последнее исправление: qwertyqw (всего исправлений: 3)

Если это строка, то искать \0. Если просто указатель, то никак. Указатели в c/с++ - это просто адреса в памяти, а что там находится по этим адресам и какого оно размера - забота программиста, а не языка.

PS: sizeof(...) подменяется во время компиляции размером переданного типа или переменной, поэтому никак не может вернуть данные, которые становятся известны только во время исполнения.
(sizeof(argv) == sizeof(char**) == sizeof(void*), sizeof(*argv) == sizeof(char*) == sizeof(void*))

ddos3
()
Ответ на: комментарий от anonymous

argc - это же сколько параметров всего передано ком.строке? как же это использовать в подсчете длины самой строки?

qwertyqw
() автор топика

Что если в char argv будет \0 до того, как наступит настоящий конец строки.

Представить argv[argc] непрерывной строкой и парсить по своим правилам.

ziemin ★★
()
Ответ на: комментарий от ddos3

int i
У меня есть массив argv[1]
как определить, что argv[1]='\0' это и есть конец строки, а не где-нибудь её середина, и будет ещё '\0'?

qwertyqw
() автор топика

Передавай размер строки либо отдельным параметром (перед строкой), либо в самой строке <1337abcdef....>, чкм.

maverik ★★
()
Ответ на: комментарий от qwertyqw

Традиционно в си \0 используется как индикатор конца строки и не должен появляться в середине (если речь идет именно о текстовой строке, а не о других данных).

argv - это массив указателей на строки (имя бинарника и параметры), размер этого массива - argc. Строки в argv ограничены \0.

[code]
# include <stdio.h>
# include <string.h>

int main(int argc, char* argv[])
{
for(int i=0; i<argc; i++)
printf(«argv[%d]=%s, len=%d\n», i, argv, strlen(argv));
return 0;
}
[/code]

ddos3
()
Ответ на: комментарий от ddos3

fixed:

# include <stdio.h>
# include <string.h>

int main(int argc, char* argv[])
{
    for(int i=0; i<argc; i++)
        printf("argv[%d]=%s, len=%d\n", i, argv[i], strlen(argv[i]));
    return 0;
}

ddos3
()
Ответ на: комментарий от ziemin

я хочу пройтись по массиву

argv[1][i]
и узнать номер последнего символа в массиве, после которого идет '\0'
как это можно сделать, чтобы не нарваться на ложный '\0'?
нужна длина строки

qwertyqw
() автор топика
Ответ на: комментарий от qwertyqw

Там не может быть «ложного» \0. первый же \0 - «настоящий». Такова конвенция. Длину строки можно узнать только одним способом - посчитать символы от начала строки и до первого \0.

ddos3
()
Ответ на: комментарий от qwertyqw

Технически можно вызвать exec() с нулем в середине строки, но тогда сам exec порежет строку по этому нулю. Потому что он тоже следует конвенции. Через терминал можно попробовать хитро извернуться и передать 0 в середине строки, но это далеко не тривиально. И если удастся, то эта строка пройдет через exec(), а exec порежет строку.

абракодабра\011111

$ ./a.out aa\0bb
argv[0]=./a.out, len=7
argv[1]=aa0bb, len=5
ddos3
()
Ответ на: комментарий от qwertyqw

страница 58, последний абзац

In the latter form argc shall be the number of arguments passed to the program from the environment in which the program is run. If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to the initial characters of null-terminated multibyte strings (NTMBS s) (17.5.2.1.4.2) and argv[0] shall be the pointer to the initial character of a NTMBS that represents the name used to invoke the program or "". The value of argc shall be non-negative. The value of argv[argc] shall be 0. [ Note: It is recommended that any further (optional) parameters be added after argv. — end note ]

string.multibyte

Многобайтовая строка с завершающим нулем или просто «многобайтовая строка» - это последовательность ненулевых байтов, которая завершается байтом со значением ноль (завершающий нулевой символ).

anonymous
()
Ответ на: комментарий от ddos3

Имхо тут сам терминал просто сожрал бэкслеш. 2тс: поэскейпи строку к-н способом перед передачей, разэскейпи при приеме, например «aa%00bb», как браузер делает.

arturpub ★★
()
Ответ на: комментарий от qwertyqw

я не уверен что через терминал нельзя передать '\0'

Передать может и сможете, но тогда все что будет после \0 попадет уже в следующий аргумент

anonymous
()
26 января 2015 г.
Ответ на: комментарий от qwertyqw

делай так

./myprogram "абракодабра\011111"
и ничего не потеряется

WRG ★★★★
()

Как узнать длину переменного масива(1аргумент терминала)

strlen(3)

Что если в char argv будет \0 до того, как наступит настоящий конец строки.

\0 это настоящий конец строки.

Там же нельзя использовать EOF? и sizeof(argv)/sizeof(*argv)

нет и нет

emulek
()
Ответ на: комментарий от qwertyqw

и узнать номер последнего символа в массиве

кстати, в utf-8 это не работает. Или у тебя KOI8-R в системе?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.