Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании. — КиберПедия 

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании.

2020-08-21 134
Динамические строки, как и другие динамические массивы, нельзя инициализировать при создании. 0.00 из 5.00 0 оценок
Заказать работу

Копирование строки в динамическую строку

При копировании строки в динамическую строку необходимо правильно выделять для неё память:

#include <string.h>                   

 

int main()

{

char* str = "aaaa bbbbb ccc ddd eeeeeee fffffff";

size_t len = strlen(str); //получение длины строки

 

char* ptr= new char[len+1]; //выделение места под динамическую строку + '\0'

 

strcpy_s(ptr, len+1, str); //копирование строки размера len+1 из str в ptr

 

cout << "ptr=" << ptr << endl; //вывод строки на экран

delete[] ptr;              //освобождение памяти

_getch();

return 0;

}

 

Передача строки в функцию в качестве параметра

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

Рассмотрим сочетания разных описаний строк, которые могут выступать в качестве фактических и формальных параметров.

Пример_1: в main()– строка-массив; в функции – строка-указатель

//пример_1_1: строка передается как неконстантный указатель на неконстантные данные

void convertToUppercase (char *);

int main()

{

char string [ ] = "aaaaaaa"; //string - константный указатель на неконстантные данные

cout << string <<endl;    //string++ - ошибка!!!, string[i]=i; - ок!!!

convertToUppercase(string);   

cout << string <<endl;

_getch();

return 0;

}

void convertToUppercase (char *sPtr)

{

while (*sPtr!= '\0') { // sPtr - неконстантный указатель на неконстантные данные

     *sPtr = toupper(*sPtr);

      ++sPtr;

 }

}

 

//пример_1_2: строка передается как неконстантный указатель на константные данные

void convertToUppercase (const char *);    

int main()

{

char string [ ] = "aaaaaaa"; //string - константный указатель на неконстантные данные

cout << string <<endl;

convertToUppercase (string);

cout << string <<endl;

_getch();

return 0;

}

void convertToUppercase (const char *sPtr)

                 // sPtr – неконстантный указатель на константные данные

                 //т.е. данные «только для чтения»

{

for (; *sPtr!= '\0'; sPtr++) //модифицировать неконстантный указатель можно

     {cout << *sPtr;  //читать константное значение можно

         // *sPtr = toupper(*sPtr); - в данном случае ошибка!!!

}                           //нельзя модифицировать константные данные

}

 

//пример_1_3: строка передается как константный указатель на неконстантные данные

void convertToUppercase (char * const);

int main()

{

char string [ ] = "aaaaaaa"; //string – константный указатель на неконстнатные данные

cout << string <<endl;       

convertToUppercase(string);

cout << string <<endl;

_getch();

return 0;

}

void convertToUppercase (char * const sPtr)

{ while (*sPtr!= '\0') { // sPtr – константный указатель на неконстантные данные

*sPtr = toupper(*sPtr);  //неконстантные данные модифицировать можно

// ++sPtr; ошибка!!! константный указатель модифицировать нельзя     

}

}

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

Указатели, объявленные как const, должны получить начальные значения при своем объявлении(если указатель является параметром функции, он получает начальное значение, равное указателю, который передается в функцию). Обратите внимание, что при объявлении константного указателя, ключевое слово const пишется между символом ‘*’ и идентификатором указателя, например: int * const ptr. Постоянство передаваемого значения задает const слева от *, например: const int * ptr.

//пример_1_4: строка передается как константный указатель на константные данные

#include <ctype.h>

 

void convertToUppercase (const char * const, int);

Int main()

{

const int n=8;

char string [n] = "aaaaaaa"; //string – константный указатель на неконстантные данные

cout << string <<endl;       

convertToUppercase(string, n);

cout << string <<endl;       

_getch();

return 0;

}

void convertToUppercase (const char *const sPtr, int n)

{  

for (int i=0; i<n; i++) // sPtr – константный указатель на константные данные

       {//*sPtr = toupper(*sPtr); //нельзя модифицировать константные данные

          cout << sPtr[i] << endl;

         //sPtr++; // ошибка!!! нельзя модифицировать константный указатель

}

}

Константный указатель на константные данные имеет наименьший уровень привилегий. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать. Это выглядит так, как если бы массив нужно было передать функции, которая его только просматривает, «читает», но не модифицирует.

Пример_2: в main() – строка-указатель; в функции – строка-указатель

// пример _2_1

void convertToUppercase (char *sPtr);

Int main()

{ char *s1= "pointer"; //s1 - неконстантный указатель на константные данные

                  //s1[3]='q'; ошибка, попытка изменить константные данные

 cout <<s1<< endl;

  convertToUppercase (s1);

 cout <<s1<< endl;

_getch();

return 0;

}

void convertToUppercase (char *sPtr)

{

 while (*sPtr!= '\0') { //sPtr - неконстантный указатель на неконстантные данные

     // *sPtr = toupper(*sPtr); если убрать комментарий – то ошибка выполнения                           
                                 //Нельзя модифицировать константные данные

                               // если данные не модифицируются, то все работает;

      ++sPtr;

 }

}


Поделиться с друзьями:

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.