Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
#1

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

17.08.2013, 19:42. Просмотров 1947. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 19:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос char массив, get(), ввести больше символов чем в массиве (C++):

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

Замена символов в массиве char
Всем привет! Задача: исходная строка (char) содержит числа десятичной системы...

Поиск слова в массиве символов char
Получаю массив символов типа char из com port. есть ли способ поиска в этом...

В динамическом массиве нельзя ввести больше 1 символа
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main(){...

Как заставить Strncpy вложить в itog часть символов строки str, если дина str больше, чем кол-во нужных нам символов?
strncpy(itog,str,size+1); cout&lt;&lt;itog; itog вообще не выводится Добавлено...

Чтение входных данных размером больше чем 4096 символов
Даны такие условия задачи, что входные данные введенные с клавиатуры (из файла)...

45
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
17.08.2013, 23:29 #41
castaway, В приложении типа Hello, World нафиг не нужен void* же.
Всмысле, что иерархия? void* может быть действительно нужен только если нужно хранить различные элементы в некой коллекции, практически во всех случаях для типов, которые будут хранится в данной коллекции, возможно написать иерархию.
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 08:10 #42
Цитата Сообщение от 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
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
18.08.2013, 13:24  [ТС] #43
Так что в итоге, хотя я как понимаю это уже переход в другую тему, есть класс у которого есть поля: учетный номер, сумма, Имя и примечание; из которых Имя и примечание это текстовые поля

Если я эти поля делаю в виде 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, потому что он за место того что бы мне вчера просто написать код в http://www.cyberforum.ru/cpp-beginners/thread939350.html начал давать какие то ссылки и т.д., мне пришлось рыться во всем это, что я не понимаю, напрягать мозг и в итоге во время написания программы моя внимательность была снижена.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.08.2013, 13:26 #44
Цитата Сообщение от VLK Посмотреть сообщение
2. я не могу ввести в поле "имя", имя состоящие из 2-х слов через пробел.
Выход как я понимаю использовать string, а потом то, что получилось переводить в char[15]
или можно еще как то?
ты читаешь что тебе пишут?
Цитата Сообщение от Schizorb Посмотреть сообщение
C++
1
std::cin.getline(a, size);
Цитата Сообщение от VLK Посмотреть сообщение
то у моего класса будет фиксированная длина, например каждый объект моего класса (ClientData) будет занимать фиксированное число байтов (124), что в свою очередь упросит запись, редактирование и чтение из файла, т.к. я знаю что каждая следующая запись находится на расстоянии +124 байта, от предыдущей, в отличии от string, где нет фиксированной длинны. Или при применении string все равно объект моего класса (ClientData) будет иметь фиксированную длину?
для этого придумали символы разделители
Код
строка1.qwertyuiopafsgdgbdbd.qeqwfdvdvds
вместо точки может быть любой другой символ, и это
Код
строка1
qwertyuiopafsgdgbdbd
qeqwfdvdvds
тоже строка с разделителями, только символ разделителя - символ перехода на новую строку

Не по теме:

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

0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
18.08.2013, 13:39  [ТС] #45
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
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 13:52 #46
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
18.08.2013, 13:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 13:52
Привет! Вот еще темы с решениями:

не выводится Массив символов (char)
в названии тома и в Файловой системе выводятся непонятные символы. Это по ходу...

Массив символов char и указатели
В общем нужно сохранить путь к диску в переменную, что бы потом использовать в...

Перевод массива char в массив int (в чем ошибка?)
не могу понять почему не работает функция void StrToIntMass (int element,...

Вставить число k1 после всех чисел в массиве больше чем digit
int i; int size_of_array=10; int last_element; int second; ...


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

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru