Другие языки программирования и технологии

как считывать строку типа char до пробела C++

Тёма Хм...
Тёма Хм...
470
char c[размер_буфера];
cin >> c;

Как раз до пробела

P.S: Жалоба на ответ выше уже направлена =) Во-первых не отвечает на вопрос, во вторых явный оверквотинг.
P.P.S: По поводу выхода за пределы буфера - в комментах =)
Александр Батькович
Александр Батькович
84 764
Лучший ответ
Тёма Хм... почему-то пропускает пробел, и идет дальше
Денис Чурпита cin.width(размер_буфера);
cin >> c;

или

cin >> setw(размер_буфера) >> с;

иначе можно выйти за пределы массива.
const size_t size = 0xFF;
char str[size];
cin >> str;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Антон Стешин
Антон Стешин
55 539
Со строками мы с вами работали практически в каждой нашей программе и до этого урока. Точнее со строковыми константами – последовательностью символов в двойных кавычках. Нам часто приходилось выводить на экран ту или иную информацию. Например:

строки в С++

Текст в кавычках и есть строковая константа. Кавычки используются для определения начала и конца строковой константы и её частью не являются.

Достаточно часто необходимо не только печатать какие-то короткие сообщения по ходу программы, а и работать с определённым текстом, хранить его где-то, обращаться к нему и редактировать, по необходимости. К строковой константе, рассмотренной выше, мы не сможем обратиться в программе, например для того, чтобы перезаписать её (мы не знаем ни ее имени ни адреса в памяти). Сейчас вы узнаете об одном из способов работы со строками в C++. Позже мы познакомимся ещё с одним способом – использованием класса string.

Итак о первом: в C++ для хранения строк используют символьные массивы. Это такие же массивы, как мы с вами уже рассматривали в статье о массивах в С++, но хранят они не числовые данные, а символьные. Можно представить символы такого массива расположенными последовательно в соседних ячейках памяти – в каждой ячейке хранится один символ и занимает один байт. Один байт потому, что каждый элемент символьного массива имеет тип char. Последним символом каждой такой строки является символ \0 (нулевой символ). Например:

строки в С++, символьные массивы в С++

Сам текст, включая пробел, состоит из 11-ти символов. Если бы в последней ячейке находилась например . (точка), а не нулевой символ \0 – для компилятора это уже не строка. И работать с таким набором символов надо было бы, как с обычным массивом – записывать данные в каждую ячейку отдельно и выводить на экран посимвольно (при помощи цикла):

строки в C++
C++
#include
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");

char str[12] = {'Ж','и','л','-','б','ы','л',' ','п','ё','с','.'};

for (int i = 0; i < 12; i++)
{
cout << str[i];
}
cout << endl;

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");

char str[12] = {'Ж','и','л','-','б','ы','л',' ','п','ё','с','.'};

for (int i = 0; i < 12; i++)
{
cout << str[i];
}
cout << endl;

return 0;
}

строки в С++, символьные массивы в С++

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

Объявляется строка таким образом – создаем массив типа char, размер в квадратных скобках указывать не обязательно (его подсчитает компилятор), оператор = и в двойных кавычках пишем необходимый текст. То есть инициализируем массив строковой константой:

строки в C++
C++
#include
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");

char str[] = "Жил-был пёс"; // '\0' присутствует неявно

cout << str << endl;

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

#include
using namespace std;

int main()
{
setlocale(LC_ALL, "rus");

char str[] = "Жил-был пёс"; // '\0' присутствует неявно

cout << str << endl;

return 0;
}

Прописывать нулевой символ не надо. Он присутствует неявно и добавляется в каждую такую строковую константу автоматически. Таким образом, при том что мы видим 11 символов в строке, размер массива будет 12, так как \0 тоже символ и занимает один байт памяти. Займет он последнюю ячейку этого символьного массива. Как видите, для вывода строки на экран, достаточно обратиться к ней по имени: cout << str << endl; cout будет выводить на экран символ за симв