Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236

char массив, get(), ввести больше символов чем в массиве

17.08.2013, 19:42. Показов 5990. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
using std::cin;
using std::cout;
using std::endl;
 
int main()
{
setlocale(LC_ALL,"");
 
char AAA[10];
char BBB[10];
 
cout << "Введите первый массив: ";
cin.get(AAA, 10);
 
cout << "Введите второй массив: ";
cin.get(BBB, 10);
 
system("pause");
return 0;
}
если я при вводе первого массива, введу больше 12 символов, допустим 12, то второй массив мне ввести не даст, как избавится от этого? cin.ignore() не помогает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.08.2013, 19:42
Ответы с готовыми решениями:

Как заполнить массив char если заранее не известно сколько символов в массиве?
Есть массив с ведомым к-вом элементов, но в него могут ввести слово с любым к-вом элементов которое не превышает к-во элементов в...

Можно ли в char строку копировать больше байт, чем ее размер?
char a = &quot;ab&quot;; strcpy(a, &quot;abcd&quot;); Можно ли так делать? Компилятор не ругнулся и при выполнении не вылетела. Память автоматически...

Ввести в массив слов все слова из предложения, в которых гласных букв больше, чем согласных
В общем, задача 1 курса: Пользователь вводит предложение.. Нужно ввести в массив слов все слова из этого предложения, в которых гласных...

45
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.08.2013, 23:29
Студворк — интернет-сервис помощи студентам
castaway, В приложении типа Hello, World нафиг не нужен void* же.
Всмысле, что иерархия? void* может быть действительно нужен только если нужно хранить различные элементы в некой коллекции, практически во всех случаях для типов, которые будут хранится в данной коллекции, возможно написать иерархию.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
18.08.2013, 08:10
Цитата Сообщение от VLK Посмотреть сообщение
А если мне надо все тоже самое, только ввести 2 слова (через пробел) в один массив, как тогда быть?
Например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
void stream_clear(std::istream & in)
{
    in.clear();
    while(in.get() != '\n');
}
 
int main()
{
    const int size = 15;
    char a[size];
    char b[size];
    
    std::cout << "Enter a: ";
    std::cin.getline(a, size);
    if(!std::cin) stream_clear(std::cin);
 
    std::cout << "Enter b: ";
    std::cin.getline(b, size);
    if(!std::cin) stream_clear(std::cin);
 
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
}
Если ввели символов больше, чем size-1, то в потоке установится failbit. Поэтому нужно сбросить флаги состояния с помощью clear(), а потом извлечь ненужные символы из потока. У меня это сделано в цикле с помощью функции get(), можно попробовать и ignore().
0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
18.08.2013, 13:24  [ТС]
Так что в итоге, хотя я как понимаю это уже переход в другую тему, есть класс у которого есть поля: учетный номер, сумма, Имя и примечание; из которых Имя и примечание это текстовые поля

Если я эти поля делаю в виде char
C++
1
2
char name[15];
char note[100];
то у моего класса будет фиксированная длина, например каждый объект моего класса (ClientData) будет занимать фиксированное число байтов (124), что в свою очередь упросит запись, редактирование и чтение из файла, т.к. я знаю что каждая следующая запись находится на расстоянии +124 байта, от предыдущей, в отличии от string, где нет фиксированной длинны. Или при применении string все равно объект моего класса (ClientData) будет иметь фиксированную длину?

Проблема указанная в первом сообщении, это 2 проблемы:
1. если вдруг при вводе будет введено больше символов, чем умещает массив, setw, ignore с этим справляются, но из-за их использования возникает другая проблема:
2. я не могу ввести в поле "имя", имя состоящие из 2-х слов через пробел.

Выход как я понимаю использовать string, а потом то, что получилось переводить в char[15]

или можно еще как то?

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

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#define rus setlocale(LC_ALL,""); SetConsoleCP(1251); SetConsoleOutputCP(1251);
#define pause system("pause");
 
 
#include <iostream> 
using std::cin;
using std::cout;
using std::endl;
using std::ios;
 
#include <iomanip>
using std::setw;
 
#include <string>
using std::string;
 
#include <fstream>
using std::ofstream;
using std::ifstream;
 
#include <windows.h>
 
 
 
class ClientData
{
private:
char name[15];
char note[100];
 
public:
 
void set_name(string rhs) 
{
const char *temp = rhs.data();
int dlina = rhs.size();
dlina = (dlina < 15 ? dlina : 14);
strncpy (name, temp, dlina);
name[dlina] = '\0';
}
 
void set_note(string rhs) 
{
const char *temp = rhs.data();
int dlina = rhs.size();
dlina = (dlina < 100 ? dlina : 99);
strncpy (note, temp, dlina);
note[dlina] = '\0';
}
 
string get_name() const { return name; }
string get_note() const { return note; } 
 
ClientData(string nam = "", string not = "")
{
set_name(nam);
set_note(not);
}
 
};
 
 
 
int main()
{
rus;
 
ClientData temp;
 
string name;
string note;
 
cout << "Введите имя: ";
std::getline(cin, name);
temp.set_name(name);
 
cout << "Введите примечание: ";
std::getline(cin, note);
temp.set_note(note);
 
cout << "Имя: " << temp.get_name() << endl;
cout << "Примечание: " << temp.get_note() << endl;
 
pause;
return 0;
}



Но все равно, проблема с char есть, в этом виновата книга, потому что там в main используется массив char, за место string ну и.. Jupiter, потому что он за место того что бы мне вчера просто написать код в Учет времени, даты, считать часы, дни, месяцы и т.д начал давать какие то ссылки и т.д., мне пришлось рыться во всем это, что я не понимаю, напрягать мозг и в итоге во время написания программы моя внимательность была снижена.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
18.08.2013, 13:26
Цитата Сообщение от VLK Посмотреть сообщение
2. я не могу ввести в поле "имя", имя состоящие из 2-х слов через пробел.
Выход как я понимаю использовать string, а потом то, что получилось переводить в char[15]
или можно еще как то?
ты читаешь что тебе пишут?
Цитата Сообщение от Schizorb Посмотреть сообщение
C++
1
std::cin.getline(a, size);
Цитата Сообщение от VLK Посмотреть сообщение
то у моего класса будет фиксированная длина, например каждый объект моего класса (ClientData) будет занимать фиксированное число байтов (124), что в свою очередь упросит запись, редактирование и чтение из файла, т.к. я знаю что каждая следующая запись находится на расстоянии +124 байта, от предыдущей, в отличии от string, где нет фиксированной длинны. Или при применении string все равно объект моего класса (ClientData) будет иметь фиксированную длину?
для этого придумали символы разделители
Code
1
строка1.qwertyuiopafsgdgbdbd.qeqwfdvdvds
вместо точки может быть любой другой символ, и это
Code
1
2
3
строка1
qwertyuiopafsgdgbdbd
qeqwfdvdvds
тоже строка с разделителями, только символ разделителя - символ перехода на новую строку

Не по теме:

Цитата Сообщение от VLK Посмотреть сообщение
Jupiter, потому что он
полюбе...:bravo:

0
 Аватар для VLK
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,236
18.08.2013, 13:39  [ТС]
Jupiter, в мой книге я пока не дошел до разделительных символов..

Добавлено через 7 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
ты читаешь что тебе пишут?
Не помогает, вот код:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define rus setlocale(LC_ALL,""); SetConsoleCP(1251); SetConsoleOutputCP(1251);
#define pause system("pause");
 
#include <iostream> 
using std::cin;
using std::cout;
using std::endl;
using std::ios;
 
#include <iomanip>
using std::setw;
 
#include <string>
using std::string;
 
int main()
{
rus;
 
char A[10];
char B[10];
 
cout << "Введите первый массив: ";
cin.getline(A,10);
cin.ignore(255, '\n');
 
 
cout << "Введите второй массив: ";
cin.getline(B,10);
cin.ignore(255, '\n');
 
cout << A << endl;
cout << B << endl;
 
 
pause;
return 0;
}


те же проблемы что и в коде в 1-м сообщении.

Добавлено через 40 секунд
Или я опять что то не правильно сделал?
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
18.08.2013, 13:52
VLK, нужен cin.clear(). Как я уже написал, если введем большее количество символов, то установится специальный флаг - failbit, что заблокирует действия с потоком. То есть, ввод второй строки не получится.

C++
1
2
3
4
5
6
7
8
9
10
11
cout << "Введите первый массив: ";
cin.getline(A, 10);
 
// если установился failbit
if(cin.fail())
{
    // сбросим флаги
    cin.clear();
    // выбросим ненужные символы
    cin.ignore(255, '\n');
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2013, 13:52

Задан символьный массив. Ввести с клавиатуры символ и вывести на консоль количество таких символов в массиве.
Помогите решить лабораторные: 1,Задан символьный массив. Ввести с клавиатуры символ и вывести на консоль количество таких символов в...

Двумерный массив. Определить, есть ли в данном массиве строка, содержащая больше положительных элементов, чем отрицательных.
Дан двумерный массив размером п*m, заполненный случайными числами. Определить, есть ли в данном массиве строка, содержащая больше...

Алгоритмы Маркова. A={a,b}. Если в P символов a больше, чем символов b, то выдать ответ a
A={a,b}. Если в P символов a больше, чем символов b, то выдать ответ a, если символов a меньше символов b, то выдать ответ b, а иначе в...

Построить машину Тьюринга. Если в P символов a больше, чем символов b, то выдать ответ a
A={a,b}. Если в P символов a больше, чем символов b, то выдать ответ a, если символов a меньше символов b, то выдать ответ b, а иначе в...

Консоль не позволяет ввести больше 254 символов
День добрый. Столкнулся с очень странной проблемой: в консоль нельзя ни вставить, ни ввести то количество символов, которое она вмещает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит реквизиты: -. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru