Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
#1

Std::string и символ перевода строки - C++

24.05.2016, 13:10. Просмотров 568. Ответов 12
Метки нет (Все метки)

Вот такая простейшая программа:
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
    char t[]="asd\n";
    string t1=t;
    printf("%s%s%u %u",t,t1.c_str(),sizeof(t),t1.size());
    return 0;
}
вывод строки двумя разными способами и подсчёт её длины, в строке реально 5 байт (платформа windows), но в случае использования std::string длина строки получается 4, символ перевода строки считается за 1, хотя по факту занимает 2 байта. Т.е. использовать std::string например с сокетами
C++
1
2
3
std::string Header;
...
send(sock,Header.data(),Header.size(),0);
уже нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2016, 13:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Std::string и символ перевода строки (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2...

Можно ли в std::string записать Ansi символ (например NUL)?
Можно ли в std::string записать Ansi символ(например NUL)?

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string...

Символ перевода строки не работает
Я полнвй 0 в C++ Купил книгу по VS++ 2010 поставил Express VS 2012, читаю...

Кроссплатформенный символ перевода строки
Есть ли в плюсах кросплатформенный символ перевода строки? Нужно для создания...

Строки через std::string
Дана строка, слова в которой состоят из букв латинского алфавита и десятичных...

12
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 13:12 #2
Цитата Сообщение от aksjhdklajsh Посмотреть сообщение
хотя по факту занимает 2 байта
С чего это?
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 13:14  [ТС] #3
символ перевода строки \n на платформе windows это два байта 0x0d и 0x0a
я же привёл программу выше, вот результат её вывода-
asd
asd
5 4
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 13:19 #4
Вы немного запутались. При редактирование текста в редакторе, новая строка в Windows состоит из двух символов ( /r/n ). Каждый из них занимает 1 байт. В unix`ах же это один символ \n.
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 13:22  [ТС] #5
Вы теоретик? Запустите вышеприведённую программу результат сохраните в файл и посмотрите на практике что из чего состоит
если изменить программу вот так
C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
    char t[]="asd\r\n";
    string t1=t;
    printf("%s%s%u %u",t,t1.c_str(),sizeof(t),t1.size());
    return 0;
}
то результат уже будет таким -
asd
asd
6 5
в hex редакторе видно что \r это 0x0d, \n это 0x0d,0x0a
в двух разных средах msvc 2010 и mingw результат одинаковый
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 13:28 #6
В t действительно на 1 байт больше, так как учитывается еще символ конца строки ( 0x00 ). string.size() же выводит размер без его учета. Сравнение с sizeof() не корректно. Сравнивайте strlength( t ) и t1.size().
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 13:38  [ТС] #7
хорошо, тогда изменим программу вот так
C++
1
2
3
4
5
6
#include <stdio.h>
int main()
{
    printf("\n");
    return 0;
}
компилим например в n.exe, выполняем n.exe > log, файл log имеет размер 2 байта, hex редактор показывает что он состоит из 2 байт: 0x0a и 0x0d
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 13:38 #8
\n = 0x0a, /r = 0x0d. Вы хотя бы заглянули в таблицу ascii...
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 13:41  [ТС] #9
к сожалению мне приходится работать не с таблицами, а с реальным компьютером, и его поведение отличается от табличного
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 13:48 #10
Цитата Сообщение от aksjhdklajsh Посмотреть сообщение
хорошо, тогда изменим программу вот так
C++
1
2
3
4
5
6
#include <stdio.h>
int main()
{
* * printf("\n");
* * return 0;
}
компилим например в n.exe, выполняем n.exe > log, файл log имеет размер 2 байта, hex редактор показывает что он состоит из 2 байт: 0x0a и 0x0d
Оно так и будет, потому что в Windows при текстовом вводе и выводе используются системные функции, которые и преобразуют новую строку в последовательность байт /r/n. Но Вы ведь собрались посылать последовательность байт по сети, которая не обязана быть читаемым текстом. Как Вы думаете, почему файловый ввод/вывод разделен на текстовый и двоичный?
Цитата Сообщение от aksjhdklajsh Посмотреть сообщение
а с реальным компьютером, и его поведение отличается от табличного
Нет.

Добавлено через 4 минуты
Попробую по простому. Если вы отправите последовательность байт char t[]="asd\n"; на unix, и эта машина сохранит его в файл, открытый в текстовом режиме, то файл будет занимать 4 байта. Если ее отправить на windows машину, и она сделает то же самое, то файл уже будет занимать 5 байт. В случае с маком будут те же 4 байта, но вместо \n будет \r.
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 13:57  [ТС] #11
Спасибо, понятно
на linux кстати вывод в текстовый файл результата printf("/n") занимает 0 байт
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.05.2016, 14:02 #12
Это странно, потому что у меня он занимает 1 байт.
0
aksjhdklajsh
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 7
24.05.2016, 14:05  [ТС] #13
"centos 6, ноль байт, перепроверил ещё раз"

нет, всё правильно, 1 байт, это я сам ошибся, прошу прощения, вместо ./a.out >log написал a.out >log и за панелями миднайт командера не увидел ошибку "команда не найдена"
0
24.05.2016, 14:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2016, 14:05
Привет! Вот еще темы с решениями:

Std::cin, символ новой строки
Подскажите, куда в данном примере после каждого cin'а девается символ новой...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в...

Отбрасывает ли std::cin символ новой строки?
Здравствуйте. Есть следующий код (это задача из книги Праты): #include...

Ncurses | вывод на экран строки std::string
Ребят, я чёт не могу разобраться. Собственно, надо в окно вывести строку,...


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

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

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