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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
#1

Форматирование строк. cout - C++

21.03.2013, 02:01. Просмотров 1414. Ответов 11
Метки нет (Все метки)

Нужно задать формат строки, чтобы выводились первые три символа.
я делал так:
C++
1
2
3
4
5
6
7
8
9
#include <iostream.h>
#include <iomanip.h>
#define S "Hello, world!"
main()
{
cout<<S.length(3);
getch();
return 0;
}
пробовал еще так:
C++
1
2
cout.precision(3);
cout<<S;
Плюс добавлял width.
Как правильно нужно это сделать?
Может причина в #define?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 02:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Форматирование строк. cout (C++):

Вывод таблицы с помощью cout, форматирование, выравнивание - C++
Ребята, помогите пожалуйста с написанием таблицы, но так, чтобы элементы отображались ровно по столбцам а то кол-во букв разное и я не...

Cout <<endl; Что это значит? Если ничего нету в cout? - C++
Здравствуйте ! Обьясните пожалуйста что значит cout &lt;&lt;endl; если он используется после цикла for?

Форматирование группы строк - C++
Здравствуйте! В консоль выводится таблица, состоящая из типовых строк. Как задать формат группе строк? //... ...

Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout - C++
Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout. Это фрагмент со структурами: ...

В чем разница std::cout и просто cout? - C++
Ребят ,подскажите на простом языке для чайников . В чем разница std::cout и просто cout?

cout.setf и cout.precision - C++
Здравствуйте. В одной книге увидел строчку кода: cout.precision(2); cout.setf(ios::fixed, ios::floatfield); Объясните, что...

11
GoldenId
128 / 126 / 32
Регистрация: 11.11.2010
Сообщений: 726
Записей в блоге: 13
Завершенные тесты: 1
21.03.2013, 02:12 #2
string.substr();
C++
1
cout< << s.substr( 0, 3 );
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:15 #3
C++
1
2
for (int i = 0; i < 3; ++i)
     cout << S[i];
1
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
21.03.2013, 02:18  [ТС] #4
GoldenId
выдало след. ошибку:
error C2228: left of '.substr' must have class/struct/union type
как с этим бороться?)

Добавлено через 46 секунд
alsav22, вау! огромное спасибо, помогло!)
0
GoldenId
128 / 126 / 32
Регистрация: 11.11.2010
Сообщений: 726
Записей в блоге: 13
Завершенные тесты: 1
21.03.2013, 02:25 #5
омг
C++
1
    cout << S.substr( 0, 3 );
0
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
21.03.2013, 02:27  [ТС] #6
GoldenId, все так же. наверное что-то в библиотеках не так. я всего лишь новичок:)
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:30 #7
Цитата Сообщение от andreyka_g Посмотреть сообщение
GoldenId
выдало след. ошибку:
error C2228: left of '.substr' must have class/struct/union type
как с этим бороться?)
Способ хороший, но строка должна быть объектом класса string:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
 
int main()
{
   string S = "Hello, world!";
   cout << S.substr( 0, 3 );
   
   cin.get();
   return 0;
}
0
GoldenId
128 / 126 / 32
Регистрация: 11.11.2010
Сообщений: 726
Записей в блоге: 13
Завершенные тесты: 1
21.03.2013, 03:08 #8
Смотрите, andreyka_g, что говорит, alsav22
Цитата Сообщение от alsav22 Посмотреть сообщение
Способ хороший, но строка должна быть объектом класса string:
Он совершенно прав. И это был мой косяк. Какой смысл.

Если хотите разобраться, в чем был мой косяк, и какой из этого следует вывод, andreyka_g, вот я тут наворотил.
C++
1
2
#include <iostream.h>
#include <iomanip.h>
Эти файлы подключаются без расширения, как показал alsav22
C++
1
#include <iostream>

Не по теме:

И iomanip Вам, andreyka_g, в данном случае не нужен.



C++
1
#define S "Hello, world!"
здесь Вы создаете макрос с именем S со значением "Hello, world!" (вместе со кавычкам), который обрабатывается препроцессором и существует в течение предварительной обработки кода, до начала компиляции. Смысл этого в том, что когда препроцессор проходит Ваш код, каждый раз, когда он встречает упоминание S, он вставляет в это место то значение, которое запомнил из директивы #define, а именно "Hello, world!"

Так можно делать, так делалось и делается. Делось - много лет назад, делается - при написании низкоуровневого кода для аппаратуры и при обучении у засидевшихся на должности преподавателей
На практике, Вы видели (если не видели, покажу), что прогресс ушёл далеко вперед... хотя бы потому что это гораздо удобнее, а следовательно выше производительность труда, зарплата, успех у женщин.

Дальше эволюция пришла к варианту
C++
1
char *mystr = "Hello world!";
здесь Вы создаете указатель на строку "Hello, world!" (уже без кавычек), которая хранится в памяти на протяжении выполнения программы. В чем отличие? Например при таком определении содержимое строки S вы можете изменять в ходе выполнения программы:
C++
1
mystr[1] = 'a';
С
C++
1
S[1] = 'a';
так не получится, потому что компилятор получит на вход
C++
1
"Hello world!"[1] = 'a';

Не по теме:

Кроме того через строку

C++
1
const char *S = "Hello world!";
можно итерироваться... проходить по ней циклом.
А через
C++
1
#define S "Hello, world!"
нельзя итерироваться? Я вот с размаху хотел заявить, что нет, нельзя, однако у меня комплируется. Действительно, фактически здесь после препроцессора компилятор получает код
C++
1
2
for (int i = 0; i < 3; ++i)
     cout << "Hello, world!"[i];
что уж совсем нехорошо. Возможно, так можно сделать, когда не хочется заморачиваться, видимо, alsav22 это и имел в виду, но для целей обучения так делать не стоит совершенно.


... наворотил много. andreyka_g, если дальше интересно, обозначьтесь.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 03:25 #9
GoldenId, вот это не будет работать:
C++
1
2
char *mystr = "Hello world!";
mystr[1] = 'a';
0
GoldenId
128 / 126 / 32
Регистрация: 11.11.2010
Сообщений: 726
Записей в блоге: 13
Завершенные тесты: 1
21.03.2013, 03:37 #10
alsav22, точна-точна. Сел писать мануалы, называется. Теперь хоть работу над ошибками сделаю.
Значит, если
C++
1
char *mystr = "Hello world";
то mystr содержит указатель на строку, которая хранится, где решит компилятор: может в области изменяемой памяти, а может - и в области незименяемой. Действительно, у меня экзепшн выскочил при выполнении.
Именно поэтому рекомендуют вариант
C++
1
const char *mystr = "Hello, world";
А чтобы изменять символы можно было, нужно, чтобы эти символы лежали в стеке:
C++
1
char mystr[] = "Hello, world!";
Подзабыл плюсы ужо
1
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
22.03.2013, 01:17  [ТС] #11
GoldenId, большое спасибо! было интересно почитать)
0
GoldenId
128 / 126 / 32
Регистрация: 11.11.2010
Сообщений: 726
Записей в блоге: 13
Завершенные тесты: 1
22.03.2013, 19:00 #12
Цитата Сообщение от andreyka_g Посмотреть сообщение
GoldenId, большое спасибо! было интересно почитать)
You are welcome. Могу дальше.

Собственно чисто сишные строки, т.н. zero-terminated строки, то есть строки, оканчивающиеся нулевым символом, это классика. Они содержатся в памяти просто как последовательность символов. Окончание определяется по нулевому символу.
Например следующие записи аналогичны.
C++
1
2
const char myarr[] { 'H', 'e', 'l', 'l', 'o', '\0' };
const char mystr[] = "Hello";
Другое дело, что даже простейшие операции со строками такого вида уже затруднительны. Вот так, например конкатенатятся (сшиваются) две сишные строки
C++
1
2
3
4
5
6
7
8
    const char str1[] = "Hello ";
    const char str2[] = "world!";
 
    // этот + 1 как раз для того, чтобы вместить нулевой символ
    char *res = new char[ strlen( str1 ) + strlen( str2 ) + 1 ];
 
    strcpy( res, str1 );
    strcat( res, str2 );
громоздко.
Именно поэтому были изобретена библиотека STL, а вместе с ней класс std::string (хотя это не единственное, что было изобретено человечеством, например в MFC, насколько я помню, их строковый класс называется CString).
Вот так сшиваются STLные строки
C++
1
2
3
4
5
6
    string str1 = "Слезы на очках,\n";
    string str2 = "Странные очки,\n";
    string str3 = "А может,\n";
    string str4 = "Слёзы на лице.";
 
    string res = str1 + str2 + str3 + str4;
Это гораздо удобнее.
Для понимания и классического образования, знать, как оперировать с чистыми сишными строками стоит. Некоторые преподаватели любят давать задания месить циклами эту raw data. На практике же афайк так никто не делает.
0
22.03.2013, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 19:00
Привет! Вот еще темы с ответами:

cout vs. std::cout - C++
всем доброго времени суток. начал самостоятельно изучать c++. скачал в сети много разныx умныx книжек.. обнаружил в примераx кода...

Форматирование строк, char to int & int to char - C++
Покажите как запихнуть число в строку и вытащить его обратно из строки. Вот всё просто в pawn str_to_num(const str) // Тупо...

почему то не переводит на другую строку cout << "введенный пункт назначения:" << a[i].pn << ' ' ; cout << "введенный пункт назначения:" << a[i].num - C++
struct Train { char pn ; unsigned int num; char time ; }; void Copy (Train &amp;pest, Train bust) //Вспомогательная функция...

new cout - C++
Как создать свой объект-аналог cout?


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

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

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