Ввод ограниченного числа символов строки — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Ввод ограниченного числа символов строки

2020-08-21 153
Ввод ограниченного числа символов строки 0.00 из 5.00 0 оценок
Заказать работу

#include <iomanip>                 

int main()

{

const int MAX = 10;             

char str[MAX];                  

cout << "\nEnter a string: ";

cin >> setw (MAX) >> str;     //ввод в строку не более MAX-1 символов

                               // один символ отводится на 0-символ

cout << "You entered: " << str << endl; 

_getch();

return 0;

}                               

Результат работы:

Enter a string: 123456789012

You entered: 123456789

Или

scanf (“% k s”, name); где k – количество символов строки, которое необходимо ввести.

Функция вывода строки

void dispstr (char *); //прототип функции вывода строки

int main()

{

                         

char str[] = "Idle people have the least leisure.";
      // или char *str = "Idle people have the least leisure.";

 

dispstr(str);     //вызов функции вывода строки

_getch();

return 0;

}

//--------------------------------------------------------------

void dispstr(char* ps) //функция вывода строки

{                    

while(*ps)            

cout << *ps++;       

cout << endl;

}

 

Или

//--------------------------------------------------------------

void dispstr(char ps[]) //функция вывода строки

{int i=0;             

while(ps[i]!='\0')            

cout << ps[i++];   

cout << endl;

}

Особенности посимвольного  вывода строки

int main()

{  

static char h[ ]="Press any key!"; //h – указатель-константа на неконстантные данные

static char *hd=" Press any key!"; //hd–неконстантный указатель на константные данные

int i;

for (i=0; i<15; i++) putchar (*(h+i)); // или h[i] ok!!!

putchar ('\n');

for (i=0; i<15; i++) putchar (*(hd+i)); // или hd[i] ok!!!

putchar ('\n');

 

while (*hd!='\0') putchar (*hd++); // ok!!!, неконстантный указатель

putchar ('\n');

 

//while (*h!='\0') putchar (*h++); // error!!!, указатель-константа

putchar ('\n');

_getch();

 return 0;

}  

Копирование строк

Для С-строк (исключая инициализацию) не определена операция присваивания, поскольку строка не является базовым типом данных. Копирование строк выполняется с помощью функций стандартной библиотеки или посимвольно «вручную».

Копирование строк «вручную»:

#include <cstring>                //for strlen()

int main()

{ char str1[] = "Oh, Captain, my Captain! "

          "our fearful trip is done";

const int MAX = 80;               

char str2[MAX];

unsigned j;

for(j=0; j<strlen(str1); j++)  

                  str2[j] = str1[j];             

str2[j] = '\0';               

cout << str2 << endl;          

_getch();

return 0;

}

или, как и для массивов,!!!

  #include <сstring>

 char s[9];

 char hello[] = "motor";

  memcpy (s, hello, sizeof (hello)); //копирование области памяти указанного размера

 cout<< s<< endl;               // motor

 

Обратите внимание, что в результате операции sizeof (hello) получим значение размера строки 6 =5+1(завершающий ‘ \ 0’). Если же определять длину строки с помощью функции strlen(hello), то получим значение, равное 5 ( без учета последнего ‘ \ 0’ ).

Копирование строк с помощью функции пользователя:

//прототипы функций

void vvodstr (char*, const int); //ввод строки                      

void vyvodstr (char*);        //вывод строки 

void copystr (char*, const char*); //копирование строки            

Int main()

{ const int MAX=80;

char str1[MAX];

char str2[MAX];              

vvodstr (str1, MAX);   

vyvodstr (str1);                    

copystr(str2, str1);    

cout << "new ";

vyvodstr (str2);

_getch();

return 0;

}

//--------------------------------------------------------------

void vvodstr(char* st, int n)

{ cout << "string? " << endl;

 cin.getline(st, n);

  

}

 

//--------------------------------------------------------------

void vyvodstr(char* st)

{cout << "string: " << endl;

 cout << st << endl;

  

}

//--------------------------------------------------------------

void copystr(char* dest, const char* src)

{

while(*src)                 //пока не нуль-символ

*dest++ = *src++;           //копировать символ из src в dest

*dest = '\0';                 //завершить строку dest нуль-символом

}

 

Оптимизация текста программы на примере функции копирования

Проследим возможности Си++ по «оптимизации» текста на примере функции копирования:

void scpy (char*, char*);             //prototype

 int main()

{

char* str1 = " Press any key!";

char str2[80];              

scpy (str2, str1);                   //copy str1 to str2

cout << str2 << endl;                    //display str2

_getch();

return 0;

}

//--------------------------------------------------------------

void scpy (char s[], char t[])

{

int i=0;

while ((s[i] = t[i])!='\0')  

              i++;

}

Или

void scpy (char *s, char *t)

{

while ((*s =*t)!='\0')  

             {s++; t++;}

}

Или

void scpy (char *s, char *t)

{

while ((*s++ = *t++)!='\0');

}

 

Или

void scpy (char *s, char *t)

{ while (*s++ =*t++); 

  }

 

Функции для работы с С-строками

# include < string. h>      

Определение длины строки

Функция    size_t strlen (const char *str)

возвращает количество символов в строке str (длину строки), не включая 0-символ.

const int MAX = 80;               

char s1[MAX] = "abcdef";              

cout << strlen(s1) << endl; // 6

Копирование строк

Функция     char* strcpy (char *strDest, const char *source)

 копирует все символы строки source, включая завершающий 0-символ, в строку strDestи возвращает указатель на ее начало. В строке strDest должно быть не менее strlen(source) + 1 байтов.

const int MAX = 80;               

char s1[MAX]="abcdef", s2[MAX]="cd";

strcpy (s1, s2); // cd warning C4996 'strcpy' was declared deprecated

 

Функция   errno_t    strcpy_s (char *strDest, size_t  sizeInBytes_strDest, const char *strSource)

возвращает 0 при успешном завершении и код ошибки – в противном случае: EINVAL (22) – Invalid argument или ERANGE () – Result too large.

Функция strcpy_s копирует содержимое strSource, включая пустой символ завершения, в strDest. Строка должна быть достаточно большой для хранения исходной строки, включая завершающий нулевой символ. Поведение strcpy_s не определено, если исходная и целевая строки накладываются.

const int MAX = 80;             

char s1[MAX]="abcdef", s2[MAX]="cd";

strcpy_s (s1, MAX, s2); // cd  

cout << s1 << endl;

Шаблонная функция (только в С++)

template <size_t size>

errno_t   strcpy_s (char (&strDest)[size], const char *strSource);

 

позволяет вызывать функцию в привычном виде:

strcpy_s (s1,s2); // cd

 

Функция   char* strncpy (char * strDest, const char * strSource, size_t  count)

 копирует не более count символов строки strSource, включая 0-символ, в строку strDest и возвращает указатель на начало строки strDest. Если 0-символ встретился в исходной строке strSource раньше, то копирование прекращается, а оставшиеся до count символы строки strDest заполняются 0-символами. В противном случае (если count меньше или равно длине строки strSource) 0-символ в strDest не добавляется.

const int MAX = 80;           

char s1[MAX]="abcdef", s2[MAX]="cd";

strncpy(s1, s2, 1); //cbcdef warning C4996: 'strncpy' was declared deprecated

strncpy(s1, s2, 4); //cd warning C4996

           

char ss1[MAX]="cd",ss2[MAX]="abcdef";

strncpy(ss1, ss2, 1); //ad     warning C4996: 'strncpy' was declared deprecated

strncpy(ss1, ss2, 4); //abcd   warning C4996

strncpy(ss1, ss2, 6); //abcdef warning C4996

 

Функция  errno_t   strncpy_s (char *strDest,  size_t  sizeInBytes_strDest, const char *strSource,  size_t count);

возвращает 0 при успешном завершении и код ошибки – в противном случае;

Функция пытается скопировать первые D символов strSource в strDest, где D является меньшим значением из количества элементов count и длины строки strSource. Если эти D символов вписываются в strDest (как sizeInBytes) и еще остается место для нулевого символа, то символы копируются, и добавляется завершающий нулевой символ, иначе strDest[0] устанавливается на нулевой символ и возвращается значение EINVAL (22) – Invalid argument.

const int MAX = 80;  

int count= 9;     

char s1[MAX]="abcdef", s2[MAX]="cdefghjklmn";

strncpy_s (s1, MAX, s2, count);  

cout << s1 << endl;           //cdefghjkl

  

Шаблонная функция (только в С++)

template <size_t size>

errno_t strncpy_s (char (&strDest)[size], const char *strSource,  size_t count);

 

позволяет вызывать функцию в привычном виде:

const int MAX = 80;  

int count=2;           

char s1[MAX]="abcdef", s2[MAX]="cdefghj\0klmn";

strncpy_s (s1,s2,count);  

cout << s1 << " " << count << endl; //cd 

 

Объединение строк

Функция   char* strcat (char* strDest, const char* source)

добавляет копию строки source, включая 0-символ, в конец строки strDest. Начальный символ строки source записывается поверх 0-символа в конце строки strDest. Функция возвращает указатель на начало результирующей строки strDest, которая заканчивается 0-символом и должна иметь размер не менее strlen(strDest) + strlen(source) + 1 байтов.

const int MAX = 80;               

char s1[MAX] = "a";

char s2[MAX] = "b";

cout << strcat(s1,s2) << endl; //ab warning C4996: 'strcat' was declared deprecated

cout << s1 << endl;         //ab

char* s;

cout << (s= strcat(s1, s2))<< endl;//abb warning C4996

 

Функция   errno_t strcat_s (char *strDest, size_t  sizeInBytes_strDest,  const char *strSource);

возвращает 0 при успешном завершении и код ошибки – в противном случае.

Функция добавляет strSource к strDest и возвращает в результате строку с нулевым символом. 0-символ strSource заменяет 0-символ strDest. Поведение strcat_s не определено, если исходная и целевая строки накладываются.

код ошибки: EINVAL (22) – Invalid argument или ERANGE () – Result too large.

char buf[16];

strcpy_s (buf, 16, "Start");

strcat_s (buf, 16, " End");              

cout << buf << endl;     // Start End

 

const int MAX = 80;               

char s1[MAX] = "a";

char s2[MAX] = "b";

strcat_s (s1, MAX, s2);

cout << s1<< endl;          //ab

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t   strcat_s (char (& strDes)[size], const char * source);

 

позволяет вызывать функцию в привычном виде:

const int MAX = 80;               

char s1[MAX] = "a";

char s2[MAX] = "b";

strcat_s (s1,s2);

cout << s1 << endl;         //ab

 

Функция   char* strncat (char* strDest, const char* source, size_t  count)

позволяет добавить не более чем count символов строки source в конец строки strDest ивозвращает указатель наstrDest. В строке strDest должно быть не менее strlen(strDest) + strlen(source) + 1 байтов.

int count =2;

const int MAX = 80;               

char s1[MAX] = "aaa";

char s2[MAX] = "bb";

strncat(s1,s2,count); // warning C4996: 'strncat' was declared deprecated

cout << s1 << endl;   //aaabb

char *s_res = strncat(s1,s2,count);   

cout << s_res << endl; //aaabbbb

 

Функция  errno_t strncat_s (char *strDest,  size_t  sizeInBytes_strDest,  const char *strSource,  size_t count)

возвращает 0 при успешном завершении и код ошибки – в противном случае.

Функция добавляет strSource к strDest и возвращает в результате строку с нулевым символом. Первоначальный 0-символ  strSource перезаписывает завершающий 0-символ strDest. Поведение strcat_s не определено, если исходная и целевая строки накладываются.

код ошибки: EINVAL (22) – Invalid argument или ERANGE () – Result too large.

const int MAX = 80;

int count =2;

char s1[MAX] = "a";

char s2[MAX] = "bbb";

strncat_s(s1, MAX, s2, count);

cout << s1<< endl;   //abb

 

Шаблонная функция (только в С++)

template <size_t size>

errno_t   strncat_s (char (& strDest)[size], const char * source, size_t count);

 

позволяет вызывать функцию в привычном виде:

int count=2;

const int MAX = 80;               

char s1[MAX] = "aaa";

char s2[MAX] = "bbb";

strncat_s (s1,s2, count);

cout << s1 << endl;         //aaabb

Сравнение строк

Функция   int   strcmp (char *s1, const char *s2)

сравнивает 2 строки в лексикографическом (т.е. упорядоченном по алфавиту) порядке с учетом различия прописных и строчных букв (рассматриваются первые символы, если они одинаковы, то рассматриваются вторые символы, третьи и т.д.). Функция возвращает 0, если строки равны; возвращает значение < 0, если первая строка меньше, чем вторая; и возвращает значение > 0, если первая строка больше, чем вторая.

cout << strcmp("abc", "ABC")<< endl; // возвращает 1

cout << strcmp("ABC", "ABC")<< endl; // возвращает 0

cout << strcmp("ABB", "ABC")<< endl; // возвращает -1

 

Функция  int   strncmp (char *s1, const char *s2,  size_t  n)

проводит сравнение только первых n символов двух строк: функция возвращает 0, если подстроки равны; возвращает значение < 0, если первая подстрока меньше, чем вторая; и возвращает значение > 0, если первая подстрока больше, чем вторая.

int count=2;

cout << strncmp("abc", "ABC", count)<< endl; // возвращает значение > 0

cout << strncmp("ABC", "abc", count)<< endl; // возвращает значение < 0

cout << strncmp("ABB", "ABC", count)<< endl; // возвращает 0

 

Функция  int   stricmp (char *s1, const char *s2)

позволяет сравнивать строки без учета регистра, т.е. без различия между прописными и строчными буквами.Она преобразует все буквы строк s1 и s2 в строчные буквы и сравнивает затем строки в лексикографическом порядке.

cout << stricmp("abc", "ABC")<< endl; // возвращает 0
                        // warning C4996: 'stricmp' was declared deprecated

cout << stricmp("ABC", "ABC")<< endl; // возвращает 0
                                // warning C4996

cout << stricmp("Ab", "ABC")<< endl; // возвращает значение < 0
                        // warning C4996

cout << stricmp("ABd", "abc")<< endl; // возвращает значение > 0
                        // warning C4996

 

Функция   int _ stricmp (const char *s1, const char *s2) работает аналогично, но уже не выдает предупреждений:

cout << _ stricmp ("abc", "ABC")<< endl; // возвращает 0
cout << _ stricmp ("ABC", "ABC")<< endl; // возвращает 0
cout << _ stricmp ("Ab", "ABC")<< endl; // возвращает значение < 0
cout << _ stricmp ("ABd", "abc")<< endl; // возвращает значение > 0
                          

Функция int strnicmp (char *s1, const char *s2,  size_t n)

проводит сравнение только первых n символов двух строк без учета регистра, т.е. без различия между прописными и строчными буквами.

cout << strnicmp("abc", "ABC", 2)<< endl; // возвращает 0
                           // warning C4996: 'strnicmp' was declared deprecated

cout << strnicmp("ABC", "AaC", 2)<< endl; // возвращает значение > 0
                        // warning C4996

cout << strnicmp("Ab", "ABC", 2)<< endl; // возвращает 0
                        // warning C4996

cout << strnicmp("ABd","acc",2)<< endl; //возвращает значение < 0
                         // warning C4996

Функция   int _ strnicmp (const char * s 1, const char * s 2, size_t count) работает аналогично, но уже не выдает предупреждений:

cout << _ strnicmp ("abc", "ABC", 2)<< endl; // возвращает 0

cout << _ strnicmp ("ABC", "AaC", 2)<< endl; // возвращает значение > 0

cout << _ strnicmp ("Ab", "ABC", 2)<< endl; // возвращает 0

cout << _ strnicmp ("ABd","acc",2)<< endl;   //возвращает значение < 0                             

Поиск символа в строке

Функция    char * strchr (const char *s, int c)

выполняет поиск символа с кодом c в строке s слева направо и возвращает указатель на позицию его первого вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0-символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0-символа.

const int MAX = 80;

char c='\0';

char s1[MAX]="ab\0cdef";

char * s = strchr(s1, c);                //указатель на символ

if (s) cout<<" n =" << int(s-s1) << endl;   //n=2 - позиция символа

 

Функция  char * strrchr (const char *s, int c)

выполняет поиск символа с кодом c в строке s справа налево и возвращает указатель на позицию его последнего вхождения в строку s. Если символа нет, то возвращается указатель NULL. 0-символ также включается в поиск, поэтому функция может использоваться для поиска в строке позиции 0-символа.

const int MAX = 80;

char c='\0';

char s1[MAX]="ab\0cdef";

char * s = strrchr(s1, c);                //указатель на символ

if (s) cout<<" n =" << int(s-s1) << endl;    //n=2 - позиция символа

 


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

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

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

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

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



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

0.103 с.