Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
17.08.2013, 19:42     char массив, get(), ввести больше символов чем в массиве #1
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() не помогает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 19:42     char массив, get(), ввести больше символов чем в массиве
Посмотрите здесь:

C++ Поиск слова в массиве символов char
первод массива char в массив int ( в чем ошибка?????) C++
Определить можно ли в двумерном массиве найти такой столбец, который разбивает массив на два так, что сумма элементов в первом больше, чем сумма элеме C++
не выводится Массив символов (char) C++
Массив символов char и указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.08.2013, 23:29     char массив, get(), ввести больше символов чем в массиве #41
castaway, В приложении типа Hello, World нафиг не нужен void* же.
Всмысле, что иерархия? void* может быть действительно нужен только если нужно хранить различные элементы в некой коллекции, практически во всех случаях для типов, которые будут хранится в данной коллекции, возможно написать иерархию.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 08:10     char массив, get(), ввести больше символов чем в массиве #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().
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
18.08.2013, 13:24  [ТС]     char массив, get(), ввести больше символов чем в массиве #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, потому что он за место того что бы мне вчера просто написать код в Учет времени, даты, считать часы, дни, месяцы и т.д начал давать какие то ссылки и т.д., мне пришлось рыться во всем это, что я не понимаю, напрягать мозг и в итоге во время написания программы моя внимательность была снижена.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.08.2013, 13:26     char массив, get(), ввести больше символов чем в массиве #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, потому что он
полюбе...

VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
18.08.2013, 13:39  [ТС]     char массив, get(), ввести больше символов чем в массиве #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 секунд
Или я опять что то не правильно сделал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 13:52     char массив, get(), ввести больше символов чем в массиве
Еще ссылки по теме:

Чтение входных данных размером больше чем 4096 символов C++
Как заставить Strncpy вложить в itog часть символов строки str, если дина str больше, чем кол-во нужных нам символов? C++
C++ Вставить число k1 после всех чисел в массиве больше чем digit

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

Или воспользуйтесь поиском по форуму:
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 13:52     char массив, get(), ввести больше символов чем в массиве #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');
}
Yandex
Объявления
18.08.2013, 13:52     char массив, get(), ввести больше символов чем в массиве
Ответ Создать тему
Опции темы

Текущее время: 11:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru