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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

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

17.08.2013, 19:42. Просмотров 1716. Ответов 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() не помогает.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 19:42     char массив, get(), ввести больше символов чем в массиве
Посмотрите здесь:
Можно ли в char строку копировать больше байт, чем ее размер? C++
C++ Поиск слова в массиве символов char
В динамическом массиве нельзя ввести больше 1 символа C++
Как заставить Strncpy вложить в itog часть символов строки str, если дина str больше, чем кол-во нужных нам символов? C++
Чтение входных данных размером больше чем 4096 символов C++
не выводится Массив символов (char) C++
Массив символов char и указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 22:39     char массив, get(), ввести больше символов чем в массиве #31
Цитата Сообщение от VLK Посмотреть сообщение
Или я опять что то не так понял?
Опять. Там написано что программа должна работать с "записями постоянной длины" и поэтому там используется массив символов типа char. Ткни меня носом где сказано что использование массивов символов правильней и удобней чем использование класса string.

Цитата Сообщение от icpu Посмотреть сообщение
Либо вы классик, используете malloc, scanf("%10d",&a) и void*
void * - не используется в С++ ?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.08.2013, 22:40     char массив, get(), ввести больше символов чем в массиве #32
Цитата Сообщение от VLK Посмотреть сообщение
в чем именно заключается невнимательность
невнимательность заключается в причине по которой создана тема:
Цитата Сообщение от VLK Посмотреть сообщение
cin.ignore() не помогает.
и того что подавалось на ввод
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
17.08.2013, 22:45  [ТС]     char массив, get(), ввести больше символов чем в массиве #33
Цитата Сообщение от castaway Посмотреть сообщение
Опять. Там написано что программа должна работать с "записями постоянной длины" и поэтому там используется массив символов типа char. Ткни меня носом где сказано что использование массивов символов правильней и удобней чем использование класса string.
Ну я только начинающий и по мне при работе с записью в файл лучше использовать фиксированную длину (особенно если ты начинающий ), а у string то она не фиксированная?

Добавлено через 2 минуты
Jupiter, но ведь рабочий вариант, он не позволяет вводить несколько слов через пробел
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 22:47     char массив, get(), ввести больше символов чем в массиве #34
Цитата Сообщение от VLK Посмотреть сообщение
а у string то она не фиксированная?
Метод string::c_str() возвращает указатель с фиксированной длиной.
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
17.08.2013, 22:48     char массив, get(), ввести больше символов чем в массиве #35
castaway, избегаются всеми возможными способами, ибо есть касты. По крайней мере приводить к пустоте по-хорошему нельзя. Баста.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 22:49     char массив, get(), ввести больше символов чем в массиве #36
Цитата Сообщение от icpu Посмотреть сообщение
castaway, избегаются всеми возможными способами, ибо есть касты. По крайней мере приводить к пустоте по-хорошему нельзя. Баста.
Что ты сейчас сказал? Я ни черта не понял. Особенно не понял к чему ты это сказал..
icpu
321 / 226 / 43
Регистрация: 10.03.2011
Сообщений: 1,091
Записей в блоге: 2
17.08.2013, 22:56     char массив, get(), ввести больше символов чем в массиве #37
Цитата Сообщение от castaway Посмотреть сообщение
void * - не используется в С++ ?
Для приведения типов используются static_cast, dynamic_cast, const_cast. Для хранения объектов - умные указатели. Для возможности хранить разные классы в одном массиве, их наследуют от одного предка, после чего вгоняют указатели в вектор.
Тип void* и приведение указателей к void* есть, но их использование может поделить вселенную на ноль нежелательно.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 23:09     char массив, get(), ввести больше символов чем в массиве #38
icpu, ок. Не это не то о чем я хотел тебя спросить. Что может заменить тип void * в С++ и почему его нежелательно использовать?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.08.2013, 23:20     char массив, get(), ввести больше символов чем в массиве #39
castaway, Иерархия, any и т.д. void* самый простой вариант конечно.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 23:26     char массив, get(), ввести больше символов чем в массиве #40
ForEveR, мм.. что иерархия?
Я не беру в расчет сторонние либы типа boost. К примеру: не вижу причин заменять void * на boost::any в приложении типа "Hello, World!"
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
17.08.2013, 23:29     char массив, get(), ввести больше символов чем в массиве #41
castaway, В приложении типа Hello, World нафиг не нужен void* же.
Всмысле, что иерархия? void* может быть действительно нужен только если нужно хранить различные элементы в некой коллекции, практически во всех случаях для типов, которые будут хранится в данной коллекции, возможно написать иерархию.
Schizorb
509 / 461 / 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
Каратель
Эксперт С++
6553 / 3973 / 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, потому что он
полюбе...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 13:39     char массив, get(), ввести больше символов чем в массиве
Еще ссылки по теме:
первод массива char в массив int ( в чем ошибка?????) C++
C++ Вставить число k1 после всех чисел в массиве больше чем digit
C++ Вычесть два массива, если в одном массиве больше элементов, чем в другом
C++ Привет. В программе вводится количество строк и столбцов. Мы можем ввести больше столбцов чем задали.
Ввести строку. Выдать все слова, которые имеют длину больше, чем длина последнего слова строки C++

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

Или воспользуйтесь поиском по форуму:
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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 секунд
Или я опять что то не правильно сделал?
Yandex
Объявления
18.08.2013, 13:39     char массив, get(), ввести больше символов чем в массиве
Ответ Создать тему
Опции темы

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