Символы и строки

Символы

В языке С для обозначения одного символа существует тип char. В действительности, char представляет из себя число, которое при выводе на экран преобразуется в картинку символа. На уровне компилятора работа идет уже с обычными числами. Таким образом, определена таблица (ASCII), в которой каждому символу сопоставлено число. Таблицу ASCII символов можно посмотреть в материалах Д. Кириенко здесь. Возможность работы с числами позволяет нам выполнять такие операции.
char c = 'A';
char d = c + 1;
cout << d << endl; // выведет 'B' (см. таблицу), так как после символа 'A' следует символ 'B'.
Другой пример:
char a = '8';
int b = (int)(a - '0'); // b = 8 так у '8' номер 58, а у '0' - 48. (int) приводит значение char к int
Вычитание '0' часто используется, если нужно переводить строку в число или наоборот.
В С определены символы конца файла, пробел, конца строки, "нулевого" символа и другие. Например символ конца строки обозначается так: '\n'. Для понимания всей глубины языка С с остальными символами тоже стоит ознакомиться.
Теперь разберемся с некоторыми тонкостями. Во-первых, если задача состоит в работе с символами, не всегда удобно использовать cin, так как он пропускает при вводе пробельные символы. Существует несколько способов решить эту проблему, конкретно для символов существует функция getchar(). Для ее использования надо подключить библиотеку cstdio. Функция getchar() берет ровно один символ из потока ввода. Пример:
#include <iostream>
#include <cstdio>

...

char c;
c = getchar(); // если на ввод дано ' ', то в отличии от cin, здесь проблем не возникнет. с = ' '
...

Строки

В С строки - это очень неудобная конструкция. Для обозначения какой-либо строки нужно текст заключить в двойные кавычки (""). Как ни странно, строка в С строка - это массив типа char. Для таких строк не существует оператора присваивания:
char s[10];
s = "Hello"; // ошибка, программа не скомпилируется
Присваивать можно только во время инициализации переменной:
char s[10] = "Hi"; // можно так писать
Так же нельзя присваивать строки друг другу:
char s[10] = "Hello";
char s2[10] = s; // это не работает
Единственный способ присваивания - это указатели. Но это крайне проблематично, так как при изменении самой строки, указатели будут указывать на ее новое значение, а не старое. (что конечно неудобно).
char s[10] = "Hi";
char *s2 = s; // при изменении s, s2 тоже меняется!
Единственный оставшийся способ - это посимвольное присваивание, но это слишком долго. Кроме того, тяжело работать со строкой, когда нельзя узнать даже ее длину...
В конце строки обязательно должен стоять "нулевой символ" (обозначается '\0'). Он используется как метка конца строки. К примеру, если нужно пробежаться по всем символам строки, то можно писать так:
char s[100] = "Hello!";
int i = 0;
while (s[i] != '\0'){
	...
	i++;
}
Для упрощения использования строк в языке С++ существует особый класс string. Для этого нужно подключить библиотеку string. Такие строки намного проще в использовании: для них определены операторы сложения, присваивания, не нужно заботиться о длине строки и о наличии "нулевого" символа в конце. Также определены команды string::size() и string::resize() и другие. Вот программа с примером использования строк:
#include <string>
#include <iostream>

using namespace std;

int main(){
	string s1, s2;
	s1 = "Hello, ";
	s2 = "world!";
	string s = s1 + s2; // s = "Hello, world!"
	for (int i = 0; i < s.size(); i++){ // пример использования string::size();
		cout << s[i];
	}// выведет всю строку

	return 0;
}
Метод string::size() возвращает длину строки.
Метод string::resize() используется для изменения длины строки. Об использовании его и других методов желательно читать документации здесь.
Теперь разберемся с вводом строк. Для string определен оператор cin, но тогда в строку будет записано всё до первого символа пробела или перевода строки. Пример:
string s;
cin >> s; // на ввод дается "Hello, world!"
cout << s << endl; // выведет "Hello,"
В таких случаях, иногда бывает удобнее пользоваться getline(). Для этого не нужно подключать никаких библиотек. Функция getline() возвращает все симолы из потока ввода до первого конца строки. Синтаксис команды такой: getline(<Поток ввода>, <имя переменной>);. Пример:
string s;
getline(cin, s); // на ввод дается "Hello, world!"
cout << s << endl; // выведет "Hello, world!"