Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
Заблокирован

Можно ли в массив чаров считать строку полностью?

12.09.2012, 12:10. Показов 4205. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня получается считать только первое слово, понимаю что есть функция getline() и еще я какую-то похожую видел, но желательно без этих средств обойтись, как-то бы компилятор убедить в массив считывать пока до конца введенной строчки не доползет....
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
int main(){
    char qip[100];
    std::cin>>qip;
    
    for(char* q=qip;((q!=qip+100)&&(*q!='\0'));++q){std::cout<<*q;}
    std::cout<<std::endl;
    return 0;
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2012, 12:10
Ответы с готовыми решениями:

Считать символы из вектора в массив чаров
Задача из вектора string перекидать значения в массив чаров, каждый элемент вектора это должен быть один из массивов... Я не могу сделать...

Как полностью считать текстовый файл в массив символов?
ifstream file(name); char line; char *text = new char; char symbol; int i = 0; while (!file.eof()) { file.getline(line,...

Массив строк как массив указателей на массивы чаров
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;; Files = NULL; int searchFile()...

19
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
12.09.2012, 12:16
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
for(char* q=qip;((q!=qip+100)&&(*q!='\0'));++q)
здесь достаточно условия
C
1
*q != '\0'
иначе если вы заполните буфер не полностью, будут проблемы.
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.09.2012, 12:18
Строки из потока читаются до первого разделителя (пробел, табуляция, перевод строки).
Чтобы получить всю строку, используй std::cin::getline().
Что за странный метод вывода строки? Чем не угодило:
C++
1
std::cout << qip << std::endl;
?
1
Заблокирован
12.09.2012, 12:34  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
используй std::cin::getline()
Она же вроде с библиотеки <string> а мне нельзя ее использовать, потому что в книжке идут примеры строк в стиле Си, или в <cstring> библиотеке getline() тоже есть? , да а насчет вывода эт я просто так смотрел если строчка будет переполнять массив что станет, поэтому и условия такие дурацкие

Добавлено через 3 минуты
например массив из 10 чаров, ввожу литерал из 20 символов , а вывод до 100 чаров, ну и там получается "строка1 до 10" *ужасные знаки** "строка2 после 10" ***ужасные знаки ****

Добавлено через 2 минуты
А вообще то странно, происходит переполнение массива, а прога продолжает дальше считывать символы. как так? правда ошибка на экран вылазит, но это ничего
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
12.09.2012, 12:38
cin.getline() из библиотэки потоков ввода вывода С++ и его объявления (а может и определения) покоятся в <iostream>, который ты подключил
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.09.2012, 12:39
AnreyKazakov, std::cin.getline() а не std::getline(). Находится он в istream.
1
Заблокирован
12.09.2012, 13:03  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
AnreyKazakov, std::cin.getline() а не std::getline(). Находится он в istream.
Тогда я совсем запутался...
Язык программирования С++. Вводный курс. 4-е изд. (Стенли Липпман)[2007] , стр 106
Цитирую "Класс string обладает дополнительный вспомогательной функцией ввода-вывода" getline()
И причем я всегда объявлял его как std::getline, и компилятор понимал всегда....
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.09.2012, 13:23
От Си осталось std::gets(), можешь её попробовать.
Тогда я совсем запутался...
Это разные функции
C++
1
2
std::istream& std::getline( std::istream& is, std::string& str );
std::istream& std::istream::getline( char* s, streamsize n );
Вторая - это метод класса std::istream, и работает он со строками Си-стиля, ты сам говорил, что тебе нужны именно они.
А глобальная функция std::getline работает с std::string.
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 13:25
AnreyKazakov, открою небольшой секрет - cin, cout, cerr и clog - это объекта классов std::istream и std::ostream. У класса std::istream есть элемент-функция getline() ( std::istream::getline()). В качестве параметров она принимает указатель на char, размер и символ-ограничитель ( по-умолчанию - '\n' ). Так же в заголовочном файле <string>, есть функция std::getline(), перегруженная для ввода в объекты класса std::string. Она в свою очередь принимает в качестве параметров ссылку на объект класса std::istream, ссылку на объект класса std::string и символ-ограничитель.

Добавлено через 1 минуту
Герц, нет такой функции, есть только std::istream::get().
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.09.2012, 13:42
Цитата Сообщение от Toshkarik Посмотреть сообщение
Герц, нет такой функции, есть только std::istream::get().
Какой такой? std::istream::getline? Ты сам описываешь её в своем сообщении. std::getline так же есть.
http://www.cplusplus.com/refer... m/getline/ъ
http://www.cplusplus.com/reference/string/getline/
Пожалуйста:
C++
1
char* std::gets( char *str );
http://en.cppreference.com/w/cpp/io/c/gets
1
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 13:45
Герц, std::gets()
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
12.09.2012, 13:46
Есть такая функция. Я четко сказал, что это наследие от C.
http://liveworkspace.org/code/... 5f0072b1af
1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 13:52
Герц, извиняюсь, перепутал, думал какая то борландовская. В любом случае она устарела, абсолютно не контролируемая. Не нужно ее использовать.
1
12.09.2012, 13:56

Не по теме:

Человек сказал, что ему нужно использовать C строки и никаких <string> :-)
Главная её проблема - отсутствие контроля выхода за границы буфера, для проверки можно и её.

1
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
12.09.2012, 13:58
Герц, это не повод использовать данную функцию. Для этого есть istream::getline() ( если нужно что бы символ-ограничитель отбрасывался ) и istream::get() ( если нужно что бы символ-ограничитель остался в потоке ).
1
Заблокирован
12.09.2012, 14:59  [ТС]
Спасибо всем, в общем переписал вот так:
C++
1
2
3
4
5
6
7
8
#include <iostream>
int main(){
    using std::cin;using std::cout;using std::endl;
    char qip[10];
    cin.getline(qip,10);
    cout<<qip<<endl;
    return 0;
    }
НО, осталась одна проблема, с переполнением массива, не делать же его размером в 10000 символов, а если объявлять так:
C++
1
char* qq=new char[size];
то надо заранее знать переменную size, тупик....
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 15:10
Правильно. Если не хватает размера, то надо расширять массив. И всё это уже есть в std::string.
1
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
12.09.2012, 15:12
Можно собезьянничать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main(){
    using std::cin;using std::cout;using std::endl;
    std::string str;
    std::getline(cin, str);
    char *qip = new char[str.size() + 1];
    std::copy(str.begin(), str.end(), qip);
    qip[str.size()] = '\0';
    cout<<qip<<endl;
    return 0;
}
1
Заблокирован
12.09.2012, 15:27  [ТС]
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Если не хватает размера, то надо расширять массив
А можно во время считывания вот в этом месте
C++
1
cin.getline(qip,1000);
узнать сколько символов считывается и если они не влазят в старый массив создать новый куда они и запишутся?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 16:21
Вызвать метод gcount() сразу же после getline(), он скажет, сколько байт было реально считано и записано. (Естессно, их будет не больше 999 + один нулевой в конце — в итоге тысяча, передаваемая как аргумент в getline.) Учтите, что '\n' в конце, если лимит в 999 символов не наступит раньше, читается из потока, но не пишется в строку (и не входит в значение gcount()). Всё, что осталось в потоке свыше 999 символов, там и останется. Можно достать следующим getline().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2012, 16:21
Помогаю со студенческими работами здесь

Очистить массив чаров
#include &quot;stdafx.h&quot; #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;windows.h&gt; #include &lt;sstream&gt; using...

Можно ли считать с консоли строку по шаблону?
например, scanf можно считать число и записать в переменную. int n; scanf(&quot;%d&quot;, &amp;n); а если строка формата &quot;command...

Можно ли с помощью JS считать get-строку?
Подскажите как это можно сделать?

считать строку чисел в массив
#include &lt;sstream&gt; #include &lt;string&gt; #include &lt;iostream&gt; using std::cout; using std::string; using std::istringstream; using...

Считать строку в динамический массив
помогите считать строку цифр неизвестной длины и перевести в массив целых чисел , код на си обычном


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru