Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Дисциплины:
2020-08-21 | 154 |
5.00
из
|
Заказать работу |
|
|
#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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!