• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Строки В Массиве

  • Автор темы Pingvin1
  • Дата начала
P

Pingvin1

Как узнать количество элементов в массиве, *char или string массив организован без применения вектора?
Для справки: в массиве string методы с применённые к следующему за последним элементом в Dev 5 C++ аля Visual Studio метод Имя_массива_string.empty() даёт false, а метод Имя_массива_ string.Length() даёт 3.
 
W

Whatka

лично я не знаю способа, и не нашёл, хотя честно пытался)

можно ли узнать для чего вам это надо сделать?
 
R

rrrFer

У string есть метод length (и size) - он возвращает длину, что вам надо?
если у вас имеется лишь указатель на массив (char) - то узнать длину никак нельзя. Указатель лишь содержит адрес начала массива в памяти. Размер массива вы должны знать сами, вы ведь выделяли для него памяти?

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

И да, аллокация отличается не только от компилятора. Функция malloc находится в хедере типа stdlib,. но может исопльзоваться что-то другое. Например компилятор микрософта исопльзует разные функции аллокации при отладке программы и релизе. При поиске утечек интсрументы типа VLD заменяют стандартный malloc и free. Наконец, malloc и free - это замечательно и низкоуровнево, но классы в C++ возволяют перегружать оператор выделения/освобождения памяти (new и delete) и если мне памяти не изменяет, можно там и аллокацией управлять.

А еще, вы можете выделить память по указателю ptr, а передать (ptr+1) (это такой же char*). Естественно перед ним не будет никакой информации о размере массива.

Т.е. размер массива, имея указать узнать никак нельзя.

МБ я вопрос не понял, но я пытался собрать ваши слова в предложения.
 
P

Pingvin1

Whatka> можно ли узнать для чего вам это надо сделать?
Чтобы для себя узнать количество элементов в массиве при отладке, наподобие print_r – php.
Для r04- я по ошибке часть своего вопроса тут разместил, вот продолжение:
Для справки: в массиве string методы с применённые к следующему за последним элементом в Dev 5 C++ аля Visual Studio метод Имя_массива_string.empty() даёт false (то есть: есть строка – не правильно), а метод Имя_массива_ string.Length() даёт 3.
 
P

Pingvin1

Следующим элементом массива string идёт следующий элемент массива string или следующая переменная string, если ни чего нет, то комп виснет. Значит, если Вам надо определить количество элементов строк, надо использовать не массив, а вектор.

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


C++:
void fnPrintSVekt (vector< string > rsText)  {//Выводит количество элементов в векторе строк и значения, требует наличия #include <vector> в файле

  charszBuf[2000],szTmp[200];//размер всего печатающего буфера и элемента

  int iKolEl;



  iKolEl=rsText.size();

  sprintf (szBuf,"Количество элементов вектора %d\n",iKolEl);

  for (int i=0;i<iKolEl;i++)  {

  sprintf (szTmp," (%d) %s-%d",i+1,rsText[I].c_str(),rsText[I].length());

  strcat (szBuf,szTmp);  }

#if defined (DOS)

  strcat (szBuf,"\n");//Для DOSдобавляется перевод строки

#endif

  fnOtlPrintf ("%s",szBuf); //универсальная печать для DOS и Windows



  }

void fnPrintSMass (string sText[],int iKolEl)  {//Выводит количество элементов в массиве строк и значения, ни как не может определить количество элементов, требует наличия какого-то #include ... в файле

//  extern string sText;-принахождениивудаленномфайле,восновномфайле [Error] variable or field 'fnPrintSMass' declared void и [Error] 'string' was not declared in this scope

  char szBuf[2000],szTmp[200];



  sprintf (szBuf,"Заданноколичествоэлементов string %d\n",iKolEl);//количествоэлементовстрочногомассива

  for (int i=0;i<iKolEl;i++)  {

  sprintf (szTmp," (%d) %s-%d",i+1,sText[I].c_str(),sText[I].length());

strcat (szBuf,szTmp);

  }

#if defined (DOS)

  strcat (szBuf,"\n");//Для DOSдобавляется перевод строки

#endif

  fnOtlPrintf ("%s",szBuf);//универсальная печать для DOS и Windows

  }



voidfnOtlPrintf(char *pszFormat,...)  {//универсальная печать для DOS и Windows с функционалом printf, работает в другом файле

  static int iNomer=1;

  char szCaption[]="Отладочное окно",szBuffer [9000];

  char *pArguments;

  pArguments =(char *)&pszFormat + sizeof(pszFormat);//указывает на следующую переменную за форматом

  vsprintf(szBuffer, pszFormat, pArguments);//в буфер помещает в соответствии с форматом аргументы, Действие функции vsrintf() эквивалентно действию функции spsintf(), но список аргументов заменен указателем на список аргументов. Этот указатель должен иметь тип char* или va_list, который определен в заголовке <stdarg.h>.

#if defined (DOS) //#define DOS #else #endif

  printf ("%s",szBuffer);//\n

#else

  sprintf(szCaption, "%s %d",szCaption, iNomer);

  iNomer++;

  MessageBox(NULL, szBuffer, szCaption, MB_OK);//WS_VSCROLL|SB_CTL

#endif

  }
Когда вывод на экран при DOS включите: #define DOS иначе закомментируйте. Данные функции работают только в главном файле иначе две ошибки: Тип string неизвестен и Пустая функция 'fnPrintSMass', это приходится учитывать.

Полный рабочий пример:

А это подарок всем и их половинкам ко дню всех влюблённых [/I][/I][/I][/I]
 
R

rrrFer

@Pingvin1, Скажи зачем это. Я думаю, что таких трюков надо избегать. Если они тебе нужны - скорее всего ты делаешь что-то неправильно.
 
P

Pingvin1

rrrFer >Скажи зачем это. Я думаю, что таких трюков надо избегать.
Это получение стандартной функции, для отладки, иногда без такой функции отладить программу проблематично.
 
R

rrrFer

Это получение стандартной функции, для отладки, иногда без такой функции отладить программу проблематично.

Приведи, пожалуйста пример (как можно проще), когда отладка без этого не получается. Я таких случаев в своей жизни не видел.
 
P

Pingvin1

…), когда отладка без этого не получается. Я таких случаев в своей жизни не видел.

Я не давно программирую на С++, только 2 раза у меня возникло желание использовать эту функцию, но в php довольно часто использовал аналогичную функцию print_r, может и можно без неё отладить, но это точно более трудоёмко.

Приведи, пожалуйстапример ...

Ну никак у меня в Wincows 8.1 не выполнялась написанная программа из Планировщика Заданий, а в 7 работала, оказалось что 8 работает только с проектами WIN32.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!