LINUX.ORG.RU

Нарушение равенства при переводе строк

 , ,


0

1

Любопытный фактец.

Если стандартную C++ стороку создавать из буфера с нулевыми символами на конце, нули будут учитываться в C++ классе, но, очевидно, что с т.з. C’шного представления строка заканчивается на нулевом символе. Т.о., существует такая строка Y, что она и равна созданной строке X, и одновременно неравна ей, в зависимости от того, используется ли C++ интерфейс или доступ к C’шной строке.

Вот пример:

#include <stdio.h>
#include <string>
#include <string.h>

int main()
{
    char str[5] = {'A', 'B', '\0', '\0', '\0'};
    auto s = std::string(str, 5);
    auto s2 = std::string("AB");
    
    // Strings are NOT equal!!!
    printf("std::strings equal? %d\n", s == s2);
    // But wait, they are equal
    printf("C-strings equal? %d\n", strcmp(s.c_str(), s2.c_str()) == 0);
}
std::strings equal? 0
C-strings equal? 1

Это нормально вообще?

★★★★★

char str[] = {‘A’, ‘B’, ‘\0’, ‘C’, ‘D’, ‘\0’};

std::string не си строка (да и вообще, это больше контейнер чем строка). зачем ей приводить свое внутреннее представление к си строке?

vvviperrr ★★★★★ ()
Последнее исправление: vvviperrr (всего исправлений: 1)
Ответ на: комментарий от vvviperrr

Это не важно. API std::string позволяет создать такую строку, и ее равенство с другой строкой одновременно ложно и истинно. Ключевые строки - последние две, где строки сравниваются. С другой стороны, для таких случаев предусмотрен специальный конструктор с тремя аргументами. Но тем не менее.

seiken ★★★★★ ()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от seiken

c_str это не геттер, это конвертер из std::string в C строку. Более того, strcmp сравнивает тупо до ‘\0’. Так что даже если c_str тебе вернёт «AB\0CD\0» то strcmp сочтёт эту строку заканчивающейся на первом ‘\0’.

ЗЫ: Сраные кавычки. Этот дебилизм когда-нибудь уже починят? Или тут толпы работников типографий тусуются, а программисты так, случайно зашли?

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от seiken

Нет, он ничего не меняет. Просто strcmp сравнивает строки иначе (до первого нулевого символа) нежели operator== у std::string. Ты применил разные операции над одними и тем же строками и получил разные результаты. Это нормально. Ты можешь снова выполнить s1 == s2 после strcmp и увидеть, что результат operator== не изменился, так как строки не изменились.

KivApple ★★★★★ ()
Последнее исправление: KivApple (всего исправлений: 2)

http://www.cplusplus.com/reference/string/string/compare/

https://en.cppreference.com/w/cpp/string/basic_string/compare

там есть примеры, да и вообще хватит применять си на с++, а потом говорить что такого быть не должно.

bhfq ★★★★★ ()
Последнее исправление: bhfq (всего исправлений: 1)
#include <stdio.h>
#include <string>
#include <string.h>

int main()
{
    char str[5] = {'A', 'B', '\0', '\0', '\0'};
    auto s = std::string(str);
    auto s2 = std::string("AB");
    
    // Strings are NOT equal!!!
    printf("std::strings equal? %d\n", s == s2);
    // But wait, they are equal
    printf("C-strings equal? %d\n", strcmp(s.c_str(), s2.c_str()) == 0);
}
std::strings equal? 1
C-strings equal? 1

Вроде нормально.

Kuzy ★★★ ()

Ты и здесь тогда ‘B’ хочешь, верно? Уверен?

#include <string>
#include <iostream>

int main()
{
    char str[5] = {'A', 'B', '\0', '\0', 'Q'};
    auto s = std::string(str, 5);
	std::cout << s.back() << std::endl;
}
// $ ./a.out
// Q
pavlick ★★ ()

нормально, не стоит мешать С и С++, не стоит использовать С строки и функции для работы с ними есть есть С++ альтернативы. Не стоит мешать альтернативы или если мешаешь - будь готов к такому дерьму.

anonymous ()
Ответ на: комментарий от vvviperrr

потому что у нее есть такой метод, нужен когда какое-то архаичное дерьмо принимает только сстроки, а писать крестцовый врапер поверх него нет времени и желания.

anonymous ()

c_str() всего навсего возвращает указатель на char. Не больше и не меньше. strcmp() сравнивает до первого нулевого символа. Все корректно.

rumgot ★★★★★ ()
Ответ на: комментарий от Stanson

ЗЫ: Сраные кавычки. Этот дебилизм когда-нибудь уже починят? Или тут толпы работников типографий тусуются, а программисты так, случайно зашли?

Ох уж эти супер-программисты, не способные написать "AB\0CD\0". Мне вот очень интересно, как такие программисты работают, описания к пулл-реквестам пишут. Или никак и только в срачиках на ЛОР участвуют?

derlafff ★★★★★ ()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от derlafff

Ох уж эти супер-программисты, не способные написать

Я не хочу «вставлять код». Я хочу пользоваться в тексте ASCII-кавычками, как это делают все программисты. И я терпеть не могу всякие уродства для умственных инвалидов типа автозамены. Если мне по какой-то неведомой причине в тексте понадобятся сраные ублюдочные «ёлочки», то я воспользуюсь Compose «/» или юникодной последовательностью.

Мне вот очень интересно, как такие программисты работают, описания к пулл-реквестам пишут.

Очевидно с использованием ASCII-кавычек, а не вот этой вот вендузятной эпидерсии притащенной сюда любителями MS Word.

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от Stanson

Я не хочу «вставлять код».

Страдай

Я хочу пользоваться в тексте ASCII-кавычками, как это делают все программисты.

Все программисты нынче используют markdown

derlafff ★★★★★ ()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от derlafff

Все программисты нынче используют markdown

Какое отношение имеет markdown к замене ASCII-кавычек на педерастические «ёлочки»? Если я ввожу ASCII-кавычку то я хочу ASCII-кавычку а не «ёлочку». Если я вдруг захочу «ёлочку» я введу «ёлочку». И markdown тут абсолютно не при чём.

Stanson ★★★★★ ()
Ответ на: комментарий от Stanson

Сраные кавычки. Этот дебилизм когда-нибудь уже починят? Или тут толпы работников типографий тусуются, а программисты так, случайно зашли?

Полностью согласен.

Исправляли бы лучшее сообщения новичков, когда они постят неформатированный код.

А то как-то глупо получается: сообщение полностью нечитаемое, зато да, типографские кавычки везде расставлены, которые, кстати, только мешают модерам и, возможно, самому ТСу исправить сообщение. Или когда тебе надо в терминал или ещё куда вставить неотформатированный код (который бы отлично встал с неизменённой пунктуацией), приходится сидеть и вычищать эти, извините, долбаные «ёлочки».

Макском, а ты хоть раз в своей жизни видел чтобы люди на твоём форуме намеренно писали ‘типографские кавычки’? Скажи мне, нахрена они вообще здесь сдались?

Уберите этот позор. Перестаньте исправлять пунктуацию. Пускай пользователи сами решают где им какие кавычки или тире ставить.

Будьте ближе к пользователям, к новичкам, пожалуйста.

Спасибо.

anonymous ()
Ответ на: комментарий от anonymous

Да ладно форматирование, просто с этими ёлками жопа не только в смысле what you see is what you mean.

«электроклапан с резьбой G1/4» нормально открытый"

Stanson ★★★★★ ()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Какое отношение имеет markdown к замене ASCII-кавычек на педерастические «ёлочки»?

При том, что ты оформляешь код. Пишешь код - оформляй его, как код. Не оформляешь код как код - не ной, что он неправильно выглядит.

derlafff ★★★★★ ()
Ответ на: комментарий от derlafff

При том, что ты оформляешь код.

Я не оформляю код. Я пишу сообщение на форуме. И я хочу чтобы его ни одна скотина не изменяла и оно выглядело именно так, как я его написал, а не так, как захотелось какому-то упоротому любителю типографских закорючек.

Stanson ★★★★★ ()
Ответ на: комментарий от Radjah

Быстро же ты порвался.

ЛОР стал форумом упоротых работников типографий, которые дрочат на свои закорючки? Если да - то стоит об этом сообщить. Если нет, то нехер изменять сообщения пользователей вопреки их желаниям.

Stanson ★★★★★ ()

Нет, ненормально. Люди с интеллектом робота-пылесоса не должны писать ни на С, ни на С++. Для вас придумали питон и джаваскрипт.

anonymous ()

Это абсолютно нормально. Из-за кривожопости разработчиков стандартов в C++ - в std::string, by-design, можно хранить не только эквивалент нуль-терминированной сишной ANSI строки но и произвольные буфферы с данными. Собственно, оттуда у вас и второй параметр при создании std::string.

Вполне логично получается, что в таком случае, s != s2. Если создать строку из char str[5] без указания размера, то получим что s == s2 .

Тут нужно понимать что вы сравниваете не ANSI-C-строки в привычном понимании, а проверяете равенство объектов s и s2, а оператор == там ещё и перегружен. Это действо ни разу не эквивалентно сишной функции сравнения строк strcmp. Про то что смешивать код на C и C++ - это плохая идея, вам уже выше написали. Не делайте так.

DawnCaster ()
Последнее исправление: DawnCaster (всего исправлений: 4)
Ответ на: комментарий от Stanson

Как раз наоборот - смысл разный, при использовании двойных кавычек небыдлокодер сразу читает как строку на ЯП и тогда ждёт и моноширинный шрифт в придачу, в любом другом случае ожидается цитирование или сравнение, поэтому не знаю какой вы лингвист, но от программирования вы несколько далеки, т.к. защищать кавычки апострофы при учёте того что они рисуются вне блоков кода serifом и говорить что это канон для программиста - может только извращенец, а касательно ёлочек - они являются по сути каноничными кавычками при общении и то что на клавиатуре кавычки не имеют уголков связано лишь с тем фактом, что кавычки не принято вкладывать и соответственно разработчики клавиатур и аскии воспользовались этим фактом и сэкономили.

AKonia ()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от Stanson

Давайте запилим опрос и проголосуем за реверт коммита с этими ёлочками-лапками. От Deleted-а удалось же избавиться таким способом, значит и эту ненужную фичу можно выпилить обратно

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Для оформления кода есть специальные блоки, а вот что делать тем кто с людьми общается не кодом, а словами и предложениями ? Теми, которые по идее должны следовать типографскому оформлению… Более того вас не смущает тогда уж и то, что текст вы пишете моноширинным текстом, а тут бац и лор в серифе отображает, да ещё и полужирным или косым ? Ну если шизеть то по полной - ой шрифт на лоре не соответствует шрифту на моей клаве… ой - я нажимаю на клавиши без текста, а на лоре буквы появляются - где мой любимый ВУСИВУГ ????

AKonia ()
Последнее исправление: AKonia (всего исправлений: 3)
Ответ на: комментарий от Stanson

Поддерживаете ли вы отказ от автоматической замены кавычек ёлочками в движке ЛОРа?

Победа демократии на ЛОРе близко! Голосуй, а не то проиграешь! Все на референдум! Долой ненужные кавычки! ASCII-кавычки - ЛОРовцам, землю - крестьянам, заводы - рабочим!

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Это ресурс для общения и в идеале оно должно стремится к наиболее разнообразному оформлению и логично разделять чистое общение с цитатами, сравнениями и блоки кода, которым и только которым свойственны прямые кавычки

AKonia ()