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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
21.03.2013, 02:01     Форматирование строк. cout #1
Нужно задать формат строки, чтобы выводились первые три символа.
я делал так:
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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2013, 02:01     Форматирование строк. cout
Посмотрите здесь:

cout vs. std::cout C++
C++ cout
C++ new cout
cout C++
почему то не переводит на другую строку cout << "введенный пункт назначения:" << a[i].pn << ' ' ; cout << "введенный пункт назначения:" << a[i].num C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
21.03.2013, 02:12     Форматирование строк. cout #2
string.substr();
C++
1
cout< << s.substr( 0, 3 );
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:15     Форматирование строк. cout #3
C++
1
2
for (int i = 0; i < 3; ++i)
     cout << S[i];
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
21.03.2013, 02:18  [ТС]     Форматирование строк. cout #4
GoldenId
выдало след. ошибку:
error C2228: left of '.substr' must have class/struct/union type
как с этим бороться?)

Добавлено через 46 секунд
alsav22, вау! огромное спасибо, помогло!)
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
21.03.2013, 02:25     Форматирование строк. cout #5
омг
C++
1
    cout << S.substr( 0, 3 );
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
21.03.2013, 02:27  [ТС]     Форматирование строк. cout #6
GoldenId, все так же. наверное что-то в библиотеках не так. я всего лишь новичок:)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 02:30     Форматирование строк. cout #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;
}
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
21.03.2013, 03:08     Форматирование строк. cout #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, если дальше интересно, обозначьтесь.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 03:25     Форматирование строк. cout #9
GoldenId, вот это не будет работать:
C++
1
2
char *mystr = "Hello world!";
mystr[1] = 'a';
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
21.03.2013, 03:37     Форматирование строк. cout #10
alsav22, точна-точна. Сел писать мануалы, называется. Теперь хоть работу над ошибками сделаю.
Значит, если
C++
1
char *mystr = "Hello world";
то mystr содержит указатель на строку, которая хранится, где решит компилятор: может в области изменяемой памяти, а может - и в области незименяемой. Действительно, у меня экзепшн выскочил при выполнении.
Именно поэтому рекомендуют вариант
C++
1
const char *mystr = "Hello, world";
А чтобы изменять символы можно было, нужно, чтобы эти символы лежали в стеке:
C++
1
char mystr[] = "Hello, world!";
Подзабыл плюсы ужо
andreyka_g
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 56
22.03.2013, 01:17  [ТС]     Форматирование строк. cout #11
GoldenId, большое спасибо! было интересно почитать)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2013, 19:00     Форматирование строк. cout
Еще ссылки по теме:

cout.setf и cout.precision C++
В чем разница std::cout и просто cout? C++
Вывод таблицы с помощью cout, форматирование, выравнивание C++

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

Или воспользуйтесь поиском по форуму:
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
22.03.2013, 19:00     Форматирование строк. cout #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. На практике же афайк так никто не делает.
Yandex
Объявления
22.03.2013, 19:00     Форматирование строк. cout
Ответ Создать тему
Опции темы

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