char (Справочник по C#)
Ключевое слово типа char — это псевдоним для типа структуры System.Char .NET, представляющий символ UTF-16 в Юникоде.
| Type | Диапазон | Размер | Тип .NET |
|---|---|---|---|
| char | От U+0000 до U+FFFF | 16 разрядов | System.Char |
Значение по умолчанию для типа char — \0 , то есть U+0000.
Тип char поддерживает сравнение, проверку равенства, а также операции инкремента и декремента. Кроме того, для операндов char арифметические и побитовые логические операторы выполняют операцию с соответствующими кодами символов и создают результат типа int .
Тип string представляет текст как последовательность значений char .
Литералы
Значение char можно указать следующим образом:
- символьный литерал;
- escape-последовательность Юникода, то есть символы \u , за которыми следует шестнадцатеричное представление кода символа из четырех символов;
- шестнадцатеричная escape-последовательность, то есть символы \x , за которыми следует шестнадцатеричное представление кода символа.
var chars = new[] < 'j', '\u006A', '\x006A', (char)106, >; Console.WriteLine(string.Join(" ", chars)); // output: j j j j
Как показано в предыдущем примере, можно также привести значение кода символа к соответствующему значению char .
В случае escape-последовательности Юникода необходимо указать все четыре шестнадцатеричные цифры. То есть \u006A — допустимая escape-последовательность, а \u06A и \u6A нет.
В случае шестнадцатеричной escape-последовательности начальные нули можно опустить. То есть \x006A , \x06A и \x6A — допустимые escape-последовательности, соответствующие одному символу.
Преобразования
Тип char неявно преобразуется в следующие целочисленные типы: ushort , int , uint , long и ulong . Он также может быть неявно преобразован во встроенные числовые типы с плавающей запятой: float , double и decimal . Он явно преобразуется в целочисленные типы sbyte , byte и short .
Неявные преобразования из других типов в тип char не предусмотрены. Но любой целочисленный тип или числовой тип с плавающей запятой явно преобразуется в char .
Спецификация языка C#
Дополнительные сведения см. в разделе Целочисленные типы в статье Спецификации языка C#.
См. также
- справочник по C#
- Типы значений
- Строки
- System.Text.Rune
- Кодировка символов в .NET
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Указатель на тип char
Я как-то давно спрашивал по поводу указателей, разобрался, всем ответившим спасибо. Но сейчас мне пришлось столкнутся с типом char :
int *a; char *b; a = new int(10); b = "bla bla bla"; // Странно ведь мы записываем в адрес, а не в разыменованный указатель cout
Хотелось бы понять, как работает указатель на тип char (хотелось бы увидеть аргументированные ответы, почему так различается, и что-то от себя как рекомендации). Шерстил интернет — по теме указателей в C++ ничего не нашел P. S.: Прошу прощения, если эта тема всех достала или мое сообщение является дубликатом (есть темы похожие, но, вроде, это не то, что мне надо).
Отслеживать
11.5k 8 8 золотых знаков 42 42 серебряных знака 69 69 бронзовых знаков
задан 12 ноя 2015 в 10:00
3,913 7 7 золотых знаков 47 47 серебряных знаков 86 86 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Давайте рассмотрим предложения из вашего примера шаг за шагом.
В этом предложении
int *a;
вы объявили переменную a как указатель на объект с типом int
В этом предложении
char *b;
вы объявили переменную b как указатель на объект с типом char
В этом предложении
a = new int(10);
был создан объект в динамической памяти типа int , который был инициализирован значением 10.
В этом предложении
b = "bla bla bla";
в левой части выражения с оператором присваивания стоит переменна с типом char * . В правой части этого выражения используется строковый литерал "bla bla bla" . Строковые литералы в C++ имеют типы константных символьных массивов.
(C++ Стандарт, 2.14.5 String literals)
8 Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow string literal has type “array of n const char”, where n is the size of the string as defined below, and has static storage duration (3.7).
Строковый литерал "bla bla bla" имеет тип const char [12] . В выражениях массивы неявно преобразуются к указателям на свой первый элемент.
Согласно стандарту C++ (4.2 Array-to-pointer conversion)
1 An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
Таким образом в приведенном предложении в правой части выражения с оператором присваивания используется значение типа const char * , которое указывает на первый символ строкового литерала "bla bla bla" . То есть имеет место попытка указателю типа char * присвоить значение указателя типа const char * . Так как не существует неявного преобразования из типа указателя на константный объект в тип указателя на неконстантный объект, то компилятор должен выдать диагностическое сообщение.
Правильно было бы объявить переменную b следующим образом
const char *b;
Тогда вышеприведенное предложение с присваиванием было бы корректно, и переменной b был бы присвоен адрес первого символа строкового литерала, стоящего в правой части выражения от знака присваивания.
b = "bla bla bla";
фактически, эквивалентно следующему предложению
В этом предложении
cout
целочисленное значение, адресуемое указателем a выводится на консоль.
Было бы более корректно записать
cout
В этом предложении
cout
при условии, что компилятор каким-то образом сгенерировал объектный модуль, несмотря на ошибку, о которой я сказал выше, выведет на консоль строковый литерал, так как для указателей типа char * оператор operator
Если вы хотите вывести на консоль именно значение самого указателя, то вам в таком случае следует написать либо
cout
cout ( b )
А если переменная b была объявлена с квалификатором const , то
После многих лет проганья на C++ я узнал, что C массивы работают не совсем так, как я думал
Я всегда думал, что в C массивы, определенные как-то так int array[13] = ; это на самом деле то же самое, что int* , то есть память выделяется на стеке, и где-то там есть локальная переменная array, указывающая на кусок памяти под 13 интов. И я думал, что единственная разница между массивом и указателем это то, что для массива переопределен оператор sizeof , и соответственно компилятор статически знает его размер.
Сегодня я учился работать в gdb, рассматривал там всякие значения и адреса переменных, и тут конфуз у меня случился. Есть переменная fptr ptrs[3] = < NULL, get_wisdom, put_wisdom >; , остановился я в gdb на брейкпоинте, и пишу
(gdb) print ptrs $12 = , 0x8048627 >
И думаю: «хмм, странно, почему этот gdb по умолчанию печатает массив/указатель как массив? Пробую print /a ptrs - не получается. Ну ладно, думаю я, видимо в gdb так переопределен принт для массивов, определенных как массивы, и /a почему-то не работает, ну да и хрен с ним.
(gdb) print &ptrs $13 = (fptr (*)[3]) 0x804a0d4
и думаю: „ага, почему-то чтобы мне получить значение указателя ptrs, надо написать & - странно плохо сделали тупо, а теперь я хочу получить адрес собственно переменной ptrs, а не ее значение:
(gdb) print &&ptrs A syntax error in expression, near `&&ptrs'.
А оно не работает. Ну тут я начинаю понимать, что что-то здесь нечисто, и возможно я неправильно понимаю C-шные массивы. Иду и создаю на тест программу:
#include int main() < int array[5] = ; printf("array = %p\n", array); printf("&array = %p\n", &array); >;
запускаю ее, а оно выдает
array = 0xbffff530 &array = 0xbffff530
Мамочки, думаю я, так что же, когда в Си объявляешь массив как массив, то он на самом деле не указатель, там нет никакой переменной в памяти, хранящей этот адрес, а есть лишь кусок памяти под 13 или сколько там элементов на стеке, и компилятор статически знает его адрес и при индексации прибавляет к нему сдвиг? И соответственно можно получить лишь адрес этого куска памяти, и этот адрес нигде как переменная не хранится. И соответственно переприсвоить массиву указатель на что-то другое нельзя.
array = calloc(6, sizeof(int)); //a.c: In function ‘main’: //a.c:7: warning: incompatible implicit declaration of built-in function ‘calloc’ //a.c:7: error: incompatible types in assignment
printf("&&array = %p\n", &&array); // какая-то там ошибка про label'ы, видимо && в C для гоуту используется? не знаю
Вот так я узнал сильно новую для себя вещь про C. Надеюсь, еще через пару лет не найду какой-нибудь нежданчик например в аргументах функций как массивах (вместо указателей) или в чем-нибудь еще.
А вообще мне непонятно, нафиг они так сделали? По-моему если бы были только указатели, без массивов, то было бы проще и удобнее. Ну конечно какая-нибудь там конструкция типа sizeof пускай работает, чтобы можно было статически размер их получать.

hlebushek ★★
30.10.15 08:54:27 MSK
Я всегда думал, что в C массивы, определенные как-то так int
array[13] = ; это на самом деле то же самое, что int*
что заставило тебя так думать?
conalex ★★★
( 30.10.15 08:59:09 MSK )
Ответ на: комментарий от conalex 30.10.15 08:59:09 MSK

Не уверен. Учил C довольно давно, и вроде когда нам пытались объяснить массивы и указатели, то говорили, что массивы это на самом деле и есть указатели, просто с сахарком. И вроде в интернете я что-то такое читал, и за все эти годы (тащемта с C и с C-массивами я не так часто работал) я не встретил ситуации, которая опровергла бы мои мысли об этом, ну и я был довольно твердо уверен, что прилично знаю C.
hlebushek ★★
( 30.10.15 09:01:13 MSK ) автор топика
А ещё function и &function, как страшно жить.
anonymous
( 30.10.15 09:06:16 MSK )

Это про мифическую близость к железу, которой нет.
Joe_Bishop ★
( 30.10.15 09:08:06 MSK )
А вообще мне непонятно, нафиг они так сделали?
Как это нафиг? А как тогда сделать так, чтобы «там нет никакой переменной в памяти, хранящей этот адрес, а есть лишь кусок памяти под 13 или сколько там элементов на стеке, и компилятор статически знает его адрес и при индексации прибавляет к нему сдвиг»?
Sorcerer ★★★★★
( 30.10.15 09:09:10 MSK )
Ответ на: комментарий от Sorcerer 30.10.15 09:09:10 MSK

А зачем? 4/8 байтиков под указатель экономим?
С хоть немного оптимизирующим компилятором не нужно. Если я где-нибудь в коде делаю &array , то пускай выделяет 4/8 байтов под хранение адреса, а если не делаю, то пусть инлайнит адрес во все места, где происходит обращение по индексу.
hlebushek ★★
( 30.10.15 09:11:16 MSK ) автор топика
Последнее исправление: hlebushek 30.10.15 09:13:58 MSK (всего исправлений: 1)

Ты ждал указатель на пачку указателей на данные?
Radjah ★★★★★
( 30.10.15 09:13:29 MSK )
Ответ на: комментарий от Radjah 30.10.15 09:13:29 MSK

Указатель на пачку указателей на данные это char** argv aka char* argv[] , и я до сих пор не знаю, отличаются ли эти варианты в качестве параметра функции чем-нибудь кроме того, что я все время забываю, там массив указателей или указатель на массивы (хотя на деле очевидно, что массив указателей, потому что если бы другой вариант был легален, то можно было бы делать и char argv[][] или char two_dimension_array[3][5] , но этого нельзя).
hlebushek ★★
( 30.10.15 09:16:57 MSK ) автор топика
Ответ на: комментарий от hlebushek 30.10.15 09:11:16 MSK
А почему нет? Си должен это позволять, иначе он не был бы Си. А если очень хочется объявить указатель на массив в стеке, то никто не мешает:
int *array = (int [5]);
Sorcerer ★★★★★
( 30.10.15 09:17:34 MSK )

Скажи еще, что ты не читал http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr , где этот «секрет» английским по белому расписан.
prischeyadro ★★★☆☆
( 30.10.15 09:21:29 MSK )
Ответ на: комментарий от Sorcerer 30.10.15 09:17:34 MSK

А почему нет? Си должен это позволять, иначе он не был бы Си.
Проверять флаги переполнения он почему-то не позволяет.
hlebushek ★★
( 30.10.15 09:31:03 MSK ) автор топика
Ответ на: комментарий от prischeyadro 30.10.15 09:21:29 MSK

Не читал. Что это вообще за сайт, и зачем его читать?
А вообще и правда неплохо написано, вот этот сниппет с картинкой все поясняют:
char a[] = "hello"; char *p = "world";
hlebushek ★★
( 30.10.15 09:32:34 MSK ) автор топика
Ответ на: комментарий от hlebushek 30.10.15 09:31:03 MSK
Проверять флаги переполнения он почему-то не позволяет.
Эта фича есть не на всех архитектурах.
Sorcerer ★★★★★
( 30.10.15 09:53:37 MSK )
это на самом деле то же самое, что int*, то есть память выделяется на стеке
есть лишь кусок памяти под 13 или сколько там элементов на стеке
Leron ★★
( 30.10.15 11:04:21 MSK )

k&r(1st ed)|file2txt|grep -c 3 "pointer"
из introduction chapter 0:
C provides pointers and the ability to do addres arithmetic. The arguments to function are passed by copying the value of the argument in the caller. When it is disired to achieve «call by reference,» a pointer may be passed explicitly, and the function may change the object to which the pointer points. Array names are passed as the location of the array origin, so array arguments are effectively call by reference.
из chapter 5 pointers and arrays
прям 1st предложение
A pointer is a VARIABLE that contains the address of another variable/
из 5.3 Pointers and Arrays
In C, there is a strong relationship between pointers and arrays, strong enough that pointers and arrays really should be treated simultaneously. Any operation which can be achievid by array subscripting can also be done with pointers.
In fact, a reference to an array is converted by the compiler to a pointer to the beginning of the array. The effect is that and array name is a pointer expression.
int a[10]; int *pa;
Since the name of an array is a synonym for the location of the zeroth element, the assigment
pa = a;
Следующий абзац(в k&r) не С++14 дружный.
There is one difference between an array name and a pointer that must be kept in mind. A pointer is a variable, so pa=a and pa++ are sensible operations. But an array name is constant, not a variable: consturctions like a=pa or a++ or p=&a are illegal.
When an array name is passed to function, what is passed is the location of the beginning of the array. Within the called function, this argument is a variable, just like any other variable, and so an array name argument is truly a pointer, that is, a variable containing an address.
----------------------------------------------- как автоматизировать в сырец определение #define UNDEGRAUNDBYTES тут какой коркодил.
/*дублирует аргументы DynArr c положеными падингами промеж */ struct args < . . . >struct Tel < struct argsargs; char[UNDEGRAUNDBYTES] padding; > int DynArr(int a, int b, int c) < if some()< return DynArr(. . .) >Tel *pa=(Tel*)&a; /* теперь pa[0] .. pa[Глубена рекусрсии-1] массив записей активации функции DynArr - можно и аргументы через голову по возвращать - ну а уж если разить в адресса возврата то и аля "break n" >
qulinxao ★★☆
( 30.10.15 11:07:30 MSK )
Ответ на: комментарий от hlebushek 30.10.15 09:11:16 MSK
Допустим, есть микроконтроллер, адрес «весит» 2 байта, а памяти ВСЕГО доступно 4 кб. Лишних 2 байта - это лишних 0,05% общей доступной памяти, расходуемой, в данном случае, вообще ни на что, т.к. не придаёт ни удобства программисту, ни компилятору. И так на каждый массив. Весьма накладно, не правда ли?
А теперь смотрим, какие компьютеры были доступны в 72-83 году во времена актуальности обсуждаемого языка программирования.
Символы и строки в С++
Символ – элементарная единица, некоторый набор которых несет определенный смысл. В языке программирования С++ предусмотрено использование символьных констант. Символьная константа – это целочисленное значение (типа int ) представленное в виде символа, заключённого в одинарные кавычки, например 'a' . В таблице ASCII представлены символы и их целочисленные значения.
// объявления символьной переменной char symbol = 'a'; // где symbol – имя переменной типа char // char – тип данных для хранения символов
Строки в С++ представляются как массивы элементов типа char , заканчивающиеся нуль-терминатором \0 называются С строками или строками в стиле С.
\0 — символ нуль-терминатора.
Символьные строки состоят из набора символьных констант заключённых в двойные кавычки. При объявлении строкового массива необходимо учитывать наличие в конце строки нуль-терминатора, и отводить дополнительный байт под него.
// пример объявления строки char string[10]; // где string – имя строковой переменной // 10 – размер массива, то есть в данной строке может поместиться 9 символов , последнее место отводится под нуль-терминатор.
Строка при объявлении может быть инициализирована начальным значением, например, так:
char string[10] = "abcdefghf";
Если подсчитать кол-во символов в двойных кавычках после символа равно их окажется 9, а размер строки 10 символов, последнее место отводится под нуль–терминатор, причём компилятор сам добавит его в конец строки.
// посимвольная инициализация строки: char string[10] = ; // десятый символ это нуль-терминатор.
При объявлении строки не обязательно указывать её размер, но при этом обязательно нужно её инициализировать начальным значением. Тогда размер строки определится автоматически и в конец строки добавится нуль-терминатор.
//инициализация строки без указания размера char string[] = "abcdefghf"; //всё то же самое только размер не указываем.
Строка может содержать символы, цифры и специальные знаки. В С++ строки заключаются в двойные кавычки. Имя строки является константным указателем на первый символ. Разработаем программу, с использованием строк.
// symbols.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < char string[] = "this is string - "; // объявление и инициализация строки cout
// symbols.cpp: определяет точку входа для консольного приложения. #include #include using namespace std; int main(int argc, char* argv[]) < char string[] = "this is string - "; // объявление и инициализация строки cout
В строке 12 с помощью функции gets() считаются все введённые символы с пробелами до тех пор, пока во вводимом потоке не встретится код клавиши enter . Если использовать операцию cin то из всего введённого считается последовательность символов до первого пробела (см. Рисунок 1).
CppStudio.com
Enter the string: CppStudio.com this is string - CppStudio.com Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Символы и строки
| Функция | Пояснение |
|---|---|
| strlen(имя_строки) | определяет длину указанной строки, без учёта нуль-символа |
| Копирование строк | |
| strcpy(s1,s2) | выполняет побайтное копирование символов из строки s2 в строку s1 |
| strncpy(s1,s2, n) | выполняет побайтное копирование n символов из строки s2 в строку s1 . возвращает значения s1 |
| Конкатенация строк | |
| strcat(s1,s2) | объединяет строку s2 со строкой s1 . Результат сохраняется в s1 |
| strncat(s1,s2,n) | объединяет n символов строки s2 со строкой s1 . Результат сохраняется в s1 |
| Сравнение строк | |
| strcmp(s1,s2) | сравнивает строку s1 со строкой s2 и возвращает результат типа int : 0 –если строки эквивалентны, >0 – если s1s2 С учётом регистра |
| strncmp(s1,s2,n) | сравнивает n символов строки s1 со строкой s2 и возвращает результат типа int : 0 –если строки эквивалентны, >0 – если s1s2 С учётом регистра |
| stricmp(s1,s2) | сравнивает строку s1 со строкой s2 и возвращает результат типа int : 0 –если строки эквивалентны, >0 – если s1s2 Без учёта регистра |
| strnicmp(s1,s2,n) | сравнивает n символов строки s1 со строкой s2 и возвращает результат типа int : 0 –если строки эквивалентны, >0 – если s1s2 Без учёта регистра |
| Обработка символов | |
| isalnum(c) | возвращает значение true , если с является буквой или цифрой, и false в других случаях |
| isalpha(c) | возвращает значение true , если с является буквой, и false в других случаях |
| isdigit(c) | возвращает значение true , если с является цифрой, и false в других случаях |
| islower(c) | возвращает значение true , если с является буквой нижнего регистра, и false в других случаях |
| isupper(c) | возвращает значение true , если с является буквой верхнего регистра, и false в других случаях |
| isspace(c) | возвращает значение true , если с является пробелом, и false в других случаях |
| toupper(c) | если символ с , является символом нижнего регистра, то функция возвращает преобразованный символ с в верхнем регистре, иначе символ возвращается без изменений. |
| Функции поиска | |
| strchr(s,c) | поиск первого вхождения символа с в строке s . В случае удачного поиска возвращает указатель на место первого вхождения символа с . Если символ не найден, то возвращается ноль. |
| strcspn(s1,s2) | определяет длину начального сегмента строки s1 , содержащего те символы, которые не входят в строку s2 |
| strspn(s1,s2) | возвращает длину начального сегмента строки s1 , содержащего только те символы, которые входят в строку s2 |
| strprbk(s1,s2) | Возвращает указатель первого вхождения любого символа строки s2 в строке s1 |
| Функции преобразования | |
| atof(s1) | преобразует строку s1 в тип double |
| atoi(s1) | преобразует строку s1 в тип int |
| atol(s1) | преобразует строку s1 в тип long int |
| Функции стандартной библиотеки ввода/вывода | |
| getchar(с) | считывает символ с со стандартного потока ввода, возвращает символ в формате int |
| gets(s) | считывает поток символов со стандартного устройства ввода в строку s до тех пор, пока не будет нажата клавиша ENTER |
Разработаем несколько программ, используя функции для работы со строками и символами.
Копирование строк
// str_cpy.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < char s2[27] = "Counter-Strike 1.6 forever"; // инициализация строки s2 char s1[27]; // резервируем строку для функции strcpy() cout
// str_cpy.cpp: определяет точку входа для консольного приложения. #include #include using namespace std; int main(int argc, char* argv[]) < char s2[27] = "Counter-Strike 1.6 forever"; // инициализация строки s2 char s1[27]; // резервируем строку для функции strcpy() cout
В строках 9, 10 создаём строковые массивы на 27 символов, словосочетание "Counter-Strike 1.6 forever" содержит 26 символов, последнее место в массиве займет нуль-символ. В строке 11 функция strcpy(s1,s2) копирует значение строки s2 в строку s1 и возвращает указатель на строку s1 . Если строка s1 будет меньше строки s2 , то скопируется то количество символов, которое вместится в строку s2 . Строка 10 всего лишь показывает, что в строке s1 содержится скопированное значение. В строке 14 функция strncpy(s3, s2, sizeof(s3)) выполняет копирование 7 символов строки s2 в строку s3 (см. Рисунок 2).
CppStudio.com
strcpy(s1,s2) = Counter-Strike 1.6 forever s1= Counter-Strike 1.6 forever CounterCounter-Strike 1.6 forever Для продолжения нажмите любую клавишу . . .
Рисунок 2 — Символы и строки
Конкатенация строк
Использование функций strcat() и strncat() , для объединения строк, то есть для их конкатенации.
// str_cat.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < char s1[30] = "I am "; char s2[] = "programmer on the C++. "; cout
// str_cat.cpp: определяет точку входа для консольного приложения. #include #include using namespace std; int main(int argc, char* argv[]) < char s1[30] = "I am "; char s2[] = "programmer on the C++. "; cout
В строке 11 функция strcat(s1,s2) объединяет строки s1 и s2 , результат сохраняется в строке s1 . По этому при объявлении строки s1 её размер установлен на 30 символов. В строке 13 функция strncat(s3,s2,10) объединяет 10 символов из строки s2 (как раз помещается слово programmer ) со строкой s3 , результат сохраняется в строке s3. И по этому размер строки s3 также задан фиксировано (см. Рисунок 3).
CppStudio.com
I am programmer on the C++. I am a good programmer. Для продолжения нажмите любую клавишу . . .
Рисунок 3 — Символы и строки
Сравнение строк
Рассмотрим работу функции strcmp() , остальные функции используются аналогично, так что каждую рассматривать не будем.
// str_cmp.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < char s1[] = "www.cppstudio.com"; char s2[] = "http://www.cppstudio.com"; cout " " s1 -> " s1 system("pause"); return 0; >
// str_cmp.cpp: определяет точку входа для консольного приложения. #include #include #include using namespace std; int main(int argc, char* argv[]) < char s1[] = "www.cppstudio.com"; char s2[] = "http://www.cppstudio.com"; cout " " s1 -> " s1 return 0; >
В строках 12, 13, 14 функция strcmp() выполняет сравнение строк, в различном порядке, таким образом были рассмотрены все возможные варианты работы данной функции. В первом случае строку s1 сравнивали с самой собой соответственно и результат равен 0. Во втором случае строка s1 оказалась меньше строки s2 поэтому результат равен 1. В третьем случае строка s1 по-прежнему меньше строки s2 , но мы поменяли эти строки местами, таким образом, порядок параметров функции изменился и результат стал равен -1 (см. Рисунок 4).
CppStudio.com
s1 == s1 -> 0 s1 < s2 ->1 s2 > s1 -> -1 Для продолжения нажмите любую клавишу . . .
Рисунок 4 — Символы и строки
Обработка символов
Функции из данной группы умеют различать, к какому типу знаков относятся те или иные символы, например буквы, цифры, специальные знаки.
// issss.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < char symbol = 'd'; // буква char digit = '9'; // цифра char space = ' '; // пробел char character = '#'; // знак // функция isalnum() проверяет является ли её аргумент буквой или цифрой cout << symbol << " - it is digit or alpha?: "; isalnum(symbol) ? cout << "true\n": cout << "false\n"; // функция isalpha() проверяет является ли её аргумент буквой cout << symbol << " - it is alpha?: "; isalpha(symbol) ? cout << "true\n": cout << "false\n"; // функция isdigit() проверяет является ли её аргумент цифрой cout << digit << " - it is digit?: "; isdigit(digit) ? cout << "true\n": cout << "false\n"; // функция isspace() проверяет является ли её аргумент пробелом cout << space << " - it is space?: "; isspace(space) ? cout << "true\n": cout << "false\n"; // функция islower() проверяет является ли её аргумент буквой нижнего регистра cout << symbol << " - it is lower alpha?: "; islower(symbol) ? cout << "true\n": cout << "false\n"; // функция isupper() проверяет является ли её аргумент буквой верхнего регистра cout // issss.cpp: определяет точку входа для консольного приложения. #include using namespace std; int main(int argc, char* argv[]) < char symbol = 'd'; // буква char digit = '9'; // цифра char space = ' '; // пробел char character = '#'; // знак // функция isalnum() проверяет является ли её аргумент буквой или цифрой cout << symbol << " - it is digit or alpha?: "; isalnum(symbol) ? cout << "true\n": cout << "false\n"; // функция isalpha() проверяет является ли её аргумент буквой cout << symbol << " - it is alpha?: "; isalpha(symbol) ? cout << "true\n": cout << "false\n"; // функция isdigit() проверяет является ли её аргумент цифрой cout << digit << " - it is digit?: "; isdigit(digit) ? cout << "true\n": cout << "false\n"; // функция isspace() проверяет является ли её аргумент пробелом cout << space << " - it is space?: "; isspace(space) ? cout << "true\n": cout << "false\n"; // функция islower() проверяет является ли её аргумент буквой нижнего регистра cout << symbol << " - it is lower alpha?: "; islower(symbol) ? cout << "true\n": cout << "false\n"; // функция isupper() проверяет является ли её аргумент буквой верхнего регистра cout
В данной программе по использованию функций вопросов возникать не должно. Функции сами по себе возвращают целочисленное значение, положительное – true , отрицательное или ноль – false . В формировании результата работы функций участвовал тернарный оператор, то есть выводилось сообщение true или false без всяких числовых значений (см. Рисунок 5).
CppStudio.com
d - it is digit or alpha?: true d - it is alpha?: true 9 - it is digit?: true - it is space?: true d - it is lower alpha?: true d - it is upper alpha?: false Для продолжения нажмите любую клавишу . . .
Рисунок 5 — Символы и строки
Итак, мы рассмотрели больше половины функций, из тех, что есть в таблице. Остальные функции используются аналогично, так что по ним примеры программ разбирать не будем.
Дата: 25.08.2012
Поделиться:
- ←Литералы в программировании
- Кириллица в консоли→
Комментарии
CraigWew
CraigWew
CraigWew
12.04.2018 п»їThe Importance of Establishing Rapport With the Customer in Real Estate and General Sales The importance of establishing rapport with the customer.
Establishing rapport with a customer has to be earned and must be approached as a very integral part of the sales process.
In order to get a customer and yourself to relate on a real one to one basis, involves two things!
First, you will have to be aware and be there! Second you must understand that there are two different stages that will occur during this process.
A-Be there-what does that mean?
o Most people don’t really listen to another person as they talk. Generally they are so busy formulating their next answer or statement that they couldn’t possibly really listen.
o If this sounds like you, being there means shut up and listen!
B-What is the first or initial stage?
o Generally you have just a few minutes to establish yourself in the customers mind as someone they want to deal with.
o When in doubt it is best to first ask questions that will draw them out and talk about themselves.
o It is also always safe to appear as a professional-I don’t mean stoic or dry, but someone who knows what they are doing and talks and looks the part.
C-Other stages
o As time goes on, through conversation and questions they will have, you will either establish your ability or not.
o Be aware that they will probably be measuring you for a while. The good news is that at some point, if you have been successful at establishing rapport-they will relax and you can both concentrate on finding or selling the home.
What else can help me develop rapport?
o By trying to understand different personality types and then by saying and asking the right questions.
o If you have good rapport (get on the same wave length as the customer) then the selling is basically over, now it’s just a matter of finding the right home or filling out the listing papers.
What about different personalities
o Since this is not a book on psychiatry, for now just understand two main types.
o There are introverted and extroverted people.
o You know the type. Think about three people you know that fit each classification.
What about body Language and speech patterns?
o If they talk fast or slow, try to mimic their speech patterns.
o If they talk loud or soft, do the same. Are they leaning forward or backward?
o Needless to say, there are lots of books written on this subject. Just be aware that it is an important factor-especially when you’re sitting in a conference room or at someone’s home discussing a $400,000 deal.
Developing rapport is a skill that can be learned and improved upon.
o We all have experienced a salesperson that sold us something and yet we didn’t feel like we were being sold. The reason is he or she, made you feel comfortable to where you trusted them.
How do we develop rapport?
o Use your eyes and ears and ask questions. To explain
o Use the eyes:
o Look at their dress-their car-their personal possessions and I mean really look at them and decipher what that tells you about them.
o Use the ears:
o Listen to what they say and ask questions to get to the bottom of their real MOTIVATION!
Now during all this conversation, there will probably be one or two things you’ll discover that you have in common with them. (Family, geographical areas, fishing, etc) When you come across common ground, let them know you’re familiarity and then take a minute to discuss it with them.
What is the Goal?
o Once they accept you as one of them you’re in position to really have a great experience in the sale as you’re now working together then as a team—you’re no longer the salesman you’re now in an advisory position.
o Remember, the customer either will or will not allow you to enter his world. If you understand this and really work hard to become empathetic with him/her, you can gain a position of trust. In most cases, you will actually see them relax (body language) when this happens you’re on the way.
o To illustrate this have you ever given a speech and noticed that as you finally connected with an audience member they will nod in approval. These things may all seem trite but they aren’t.
In closing, if you can earn a customers trust, selling a product or service is much easier and the experience can be enoyable for everyone involved.
Always remember that a Win/Win is the best situation. Visit site: http://gameone.club/ article marketing tutorial
wElenaFax
22.08.2017 Работа в интернете Войдите, чтобы ответить
npavelFax
CraigWew
12.04.2018 п»їInside Programming: Python One of the high-level programming languages, Python is considered to be the most dynamic language that focuses on code readability. The best part of learning this language is that there are fewer steps in execution as compared to Java or C++.
Founded by Guido Van Rossum in the year 1991, it enjoys the status of being used in top organizations all over the world. Since its inception, the language has evolved drastically, imbibing advancements as the years have passed.
Benefits of Python
Interactive
Interpreted
Dynamic
High-Level
Portable
Most of the companies in fields like gaming, networking, graphic design applications, etc use this language as it has the most dynamically challenging module. Nearly 14% of the programming community of this world uses this language across different platforms like Linux, MacOS, Windows and UNIX.
Why We Love Python?
If you are using a multi-protocol network, then this is the best language. It definitely increases your overall productivity.
Python has large and extensive support libraries like string operations, Internet, web service tools, operating system interfaces and protocols. If you are looking for the best support system, then look no further. Python has all the important tasks scripted into it
A high-level language that has user-friendly structures that is also easy to learn.
Python has Enterprise Application Integration which makes Web developing easy by calling COB and COBRA components that are integrated within its structures. It’s powerful control abilities help in calling C, C++, Java through Jython
Future of Python
Computing world’s giant organization Google has made Python one of its official language. Making the future for Python enthusiasts secure. Learn this dynamic and robust programming language to get the best jobs in the industry! Visit site: http://gameone.club/ seo 2018 kindle Войдите, чтобы ответить
PRO_in_ALL
30.04.2016 здравствуйте, такие дела: я создал класс, в нём — символьный класс, хочу заполнить его с помощью gets, и мне вылезает ошибка что то вроде «функция ‘gets’ не является безопасной…» и не компилируется, скажите какие есть альтернативы заполнения символьного массива? только не по одной букве. Войдите, чтобы ответить
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.
Rust Journey: Хотите освоить язык программирования, который завоевывает мир?
Илон Маск, один из ведущих инноваторов нашего времени, утверждает, что за Rust будущее. А когда последний раз он ошибался в своих прогнозах?
✨ Не упустите свой шанс быть в авангарде IT-революции. Подписывайтесь на канал Rust Journey и начните свой путь в захватывающий мир Rust сегодня!