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

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

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

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

17.08.2013, 19:42. Просмотров 1742. Ответов 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 строку копировать больше байт, чем ее размер? - C++
char a = &quot;ab&quot;; strcpy(a, &quot;abcd&quot;); Можно ли так делать? Компилятор не ругнулся и при выполнении не вылетела. Память автоматически...

Замена символов в массиве char - C++
Всем привет! Задача: исходная строка (char) содержит числа десятичной системы счисления. Найти их, создать новую строку, в которой...

Поиск слова в массиве символов char - C++
Получаю массив символов типа char из com port. есть ли способ поиска в этом массиве необходимого слова кроме как побайтово копировать ...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 22:39 #31
Цитата Сообщение от VLK Посмотреть сообщение
Или я опять что то не так понял?
Опять. Там написано что программа должна работать с "записями постоянной длины" и поэтому там используется массив символов типа char. Ткни меня носом где сказано что использование массивов символов правильней и удобней чем использование класса string.

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

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

0
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 13:39
Привет! Вот еще темы с ответами:

Массив символов char и указатели - C++
В общем нужно сохранить путь к диску в переменную, что бы потом использовать в _findfirst Но сколько бы я не бился над этим, ничего не...

не выводится Массив символов (char) - C++
в названии тома и в Файловой системе выводятся непонятные символы. Это по ходу связано с чаровским массивом. Как мне сделать? char...

первод массива char в массив int ( в чем ошибка?????) - C++
не могу понять почему не работает функция void StrToIntMass (int element, char buffer) { int k = 0,j = 0; char...

Вставить число k1 после всех чисел в массиве больше чем digit - C++
int i; int size_of_array=10; int last_element; int second; int even; int k1= 4, k2= 7; float digit = 2;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.08.2013, 13:39
Ответ Создать тему
Опции темы

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