Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Базовые понятия С++. Не работает строка

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Здравствуйте! Выдаёт какую-то ошибку. Вот скрин с кодом: drive.google.com/...​MbjhBd0k/view?usp=sharing

А вот сам код:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");
    string password;
    int name;
    cout << "Введите ваше имя: " << endl;
    cin >> name;
    cout << "Enter your password" << endl;
    getline(cin, password);
    if (password = "art") {
        cout << name << ", здравствуйте!";
    } else {
        cout << "*Неверный пароль";
    }
    cin.get();
    return 0;
}
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn

Найкращі коментарі пропустити

Как мило выглядит, сразу первый курс вспомнился.

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

для сравнения двух значений используют ==, а если используют = то это просто присваивание значения слева в переменую справа

это

if (password = „art”)

замените вот на это

if (!strcmp(password, „art”))
setlocale(LC_ALL, «Russian»);

локаль не та

Рабочий вариант

Microsoft Visual Studio Community 2015
Версия 14.0.25431.01 Update 3

s1.postimg.org/4v96dqplbj/cpp2.jpg

Может пригодится по методике
«Как отлаживать маленькие программы»
habrahabr.ru/post/339038

Как-то странно сначала код ревью, а если не помогло — ассерты и дебаг. По-моему по затратам времени как раз наоборот надо делать. Ассерты покрывают 80% проблем, дебаг — 95% оставшегося. 1% когда дебаг не помогает уходит в ревью и депрессивные размышления о бренности бытия, относительности истины, и LD50 кофеина.

„Вторая ссылка” в SO: stackoverflow.com/a/37657727/642034

Мудрые пацаны вместо password = «art» пишут «art» = password, тогда компилятор гавкнет, когда второе «=» прощелкал

Бывают же и просто опечатки

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

меня пото жабисти чмирили за С++ стайл
if (

«art» = password

)
гаварили шо это гавно — привичка от которой текут глаза в тру жабров

Потому что так нельзя сравнивать строки в джаве, эквивалентно сравнению char* через == вместо strcmp.

я имею ввіду: «слєва в виражєніі if пісать канстанту шоп нє дай Бог, вмєсто == нэ впрердоліть =»

жависти одинарного = в if не бояццо !!!,
для жавистов лєва канстанта в if виражении, то С++головного мосха

А они не боятся что будет типа

Dzhy s;

if (s.equals("gurda")) 

И оно вызовет какой-то не тот equals?

не знаю, не успів спросить, вигнали ссаними тряпками нах с проекта

Тут сравниваются разные типы и будет ошибка на этапе компиляции.

Чому? Сигнатура-то public boolean equals(Object obj)

s не инициализирован.
Если инициализировать то выдаст false, так как если не переопределить то будет сравнивать ссылки на обьекты, что знают все джависты, если переопределить, то будет логика которую сам реализуешь.

career.guru99.com/...​java-interview-questions
Q64. Can variables be used in Java without initialization?

Ans: In Java, if a variable is used in a code without prior initialization by a valid value, program doesn’t compile and gives an error as no default value is assigned to variables in Java.

О б-же, это же просто пример, там должно было быть троеточие.

Тру джавист напишет
if("gurda".equals(s))
Потому что не нужно дополнительно проверять на null.

так в тебе корона приросла,
я попроще, готов кидать выртуальне говно лопатой за рейт 60 ойро час на Жаба проектах

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

В джаве, если не ошибаюсь, присваивание в условии вообще ошибка компиляции.

а причем тут нежность, зачем в говне сидеть? с подходом абы работало можно переменные а,б,в называть, на русском до кучи

Переключать раскладку надоест. А так — i, j, k называют, особенно в циклах.

При том, при том
1. во-первых это настолько незначительные изменения-дивиации в кодинг стиле на которые в принципе не следует обращать внимание, особенно если ты и так уже сидишь по уши в этом самом говне, в этой ситуации глупо жаловаться на грязь под ногтями.
2. всё идеально все равно не бывает. Мелкие недочеты всегда можно простить если все принципиальное уже в порядке (архитектура там, алгоритмическая сложность, перфоманс, требования по секюрити, корректная обработка нештатных ситуаций... п продолжай список до безконечности). Если же принципиальные вещи не в порядке то чинить надо в первую очередь их.
3. И да, код конвеншенов в мире существует больше одного, такое бывает даже в языках, где сущетвует один общепринятый стандартный конвеншен (сюрприз да?).
4. В природе существуют люди с разным бекграундом, и разными привычками и взглядами связанными с этим бекграундом. И когда эти люди встречаются это хорошо, ибо будучи разными они могут быть сильны в разном и вместе быть сильнее чем поодиночке. Именно это а не наличие в команде женщин, нацменов, и людей нетрадиционной ориентации называется модным нынче словом «дайверсити».

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

ну для меня это не оправдание, даже самый мелкий шаг в правильную сторону ценный

2. всё идеально все равно не бывает. Мелкие недочеты всегда можно простить если все принципиальное уже в порядке (архитектура там, алгоритмическая сложность, перфоманс, требования по секюрити, корректная обработка нештатных ситуаций... п продолжай список до безконечности). Если же принципиальные вещи не в порядке то чинить надо в первую очередь их.

определенно

3. И да, код конвеншенов в мире существует больше одного, такое бывает даже в языках, где сущетвует один общепринятый стандартный конвеншен (сюрприз да?).

использовать один, установив его административно

4. В природе существуют люди с разным бекграундом, и разными привычками и взглядами связанными с этим бекграундом.

это вообще не при чем

Устанавливая что-то административно, и обращая внимание на мелкие шаги, лишитесь инициативных сотрудников.

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

)))))
Особенно когда юзаете сторонний код как подпроекты.
Код стайл должен стремиться к тому, чтобы ваш код не отличался от окружающего куска кода.
Правда, иногда по стилю можно легко увидеть, кто накосячил.

Или когда один и тот же проект написан на нескольких языках....

а зачем сторонний код подключать в виде исходников? и все равно при чем это тут, ну вот он есть и он ридонли, пусть в нем будет что угодно, это же сторонний

а зачем сторонний код подключать в виде исходников?

Случаи бывают разные. Мы вот части наших клиентов деливерим собраные артифакты, а часть хочеть исходники и они сами их собирают.

ну вот он есть и он ридонли

А почему он ридонли? рано или поздно и в стороннем коде бывает надо что-то подкрутить.

Случаи бывают разные. Мы вот части наших клиентов деливерим собраные артифакты, а часть хочеть исходники и они сами их собирают.

и для этого надо прямо в проект подключать сторонние исходники?

А почему он ридонли? рано или поздно и в стороннем коде бывает надо что-то подкрутить.

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

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

git merge в помощь

а вы суровые ребята, я сливаюсь

У нас только в виде исходников, нужна trusted сборка всех third parties.

ну это ж из-за беды в с++, в дотнете это значительно упрощено

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

Нет, не по этому. Нету в С++ никакой беды :) Это секюрити конвеншен продукта такой. Вот кодинг конвеншены ты любишь а секюрити почему-то нет.

Хотя вот как раз от этого конвеншена я бы какраз с удовльствием отказался... а ну я вобщем-то и так разрушитель конвеншенов в этом топике.

Нет, не по этому. Нету в С++ никакой беды :) Это секюрити конвеншен продукта такой. Вот кодинг конвеншены ты любишь а секюрити почему-то нет.

это требование имеет смысл далеко не для всех платформ, я сужу по дотнету, вот и объяснение почему я против

Находишь открытый стек, он работает, а потом начинаются хотелки, которые проще (или единственно возможно) реализовать в затянутом стеке. Или надо в нем писать свой модуль, который будет общаться уже с остальным приложением.

ну для меня это не оправдание, даже самый мелкий шаг в правильную сторону ценный

Никто и не собирался оправдываться. Есть ситуации, когда надо делать не мелкий шажок а гигантский прыжок в будущее. Они не так редки и тратить время и ментальную энергию на мелкие шажки глупо.

И если кому-то выедает глаза
if (2 == version)
вместо
if (version == 2)
то он таки нежинка. оба выражения одинаково читабельны и понятны.

Ещё пример, коллега вот жаловался, что ему какие-то фанатичные сишарперы выели мозг в пул-реквесте по поводу использования string vs CString при сравнении стрингов.

использовать один, установив его административно

Это не всегда возможно сделать, точнее не всегда рационально и не всегда на это хватает решимости. Вот у меня к примеру есть тонна легаси-легаси кода без овнера, следующего совсем странным и противоречивым конвенциям. Одна из причин не инфорсить там определённую конвенцию — я просто не хочу этим заниматься, особенно в коде, который должен вот-вот умереть, и не хочу его овнерить. Другая частая причина — история комитов-блеймов. Некоторые люди её ценят.

это вообще не при чем

Ну что не при чем. Работал вот я на одном проэекте, был у нас набор микросервисов на Пайтоне. В большинстве использовался стандартный pep-8, Я работал в основном с сервисами написанными на Twisted... d Twisted code convention, а «родной» для меня вообще c-style code convention. В результате у меня в голове была полная каша из конвеншенов и я в принципе не понимал где следует большие буквы использовать а где маленькие. Что ни о чем то?

Есть ситуации, когда надо делать не мелкий шажок а гигантский прыжок в будущее. Они не так редки и тратить время и ментальную энергию на мелкие шажки глупо.

это такой же «хороший» аргумент против разбивания тасок на более мелкие

И если кому-то выедает глаза
if (2 == version)
вместо
if (version == 2)
то он таки нежинка. оба выражения одинаково читабельны и понятны.

хоть и 1й вариант семантически неправильный, но такое действительно пофиг

Ещё пример, коллега вот жаловался, что ему какие-то фанатичные сишарперы выели мозг в пул-реквесте по поводу использования string vs CString при сравнении стрингов.

тот кто предпочитает CString обычному стрингу не должен писать на дотнете, он ему просто не нужен и он его не знает

Одна из причин не инфорсить там определённую конвенцию — я просто не хочу

законно :)

Другая частая причина — история комитов-блеймов. Некоторые люди её ценят.

она никуда не денется после очередного коммита

В результате у меня в голове была полная каша из конвеншенов и я в принципе не понимал где следует большие буквы использовать а где маленькие.

ну это исключительно твоя проблема, запомни в какой микросервисе какая конвенция, не можешь — запиши

это такой же «хороший» аргумент против разбивания тасок на более мелкие

Общего в описанных ситуациях только слова большие и мелкие. Зачем ты вносишь в разговор вещи не относящиеся к обсуждаемой теме вообще?

хоть и 1й вариант семантически неправильный, но такое действительно пофиг

В смысле семантически не правильный? Про свойства операций слышал когда нибудь? Там.. симметричность к примеру?

он ему просто не нужен и он его не знает

Ну.. тут не стану спорить, ни я ни наверно тот человек дот нета действительно не знаем. А тебе никогда не приходилось писать на языках, которых ты не знаешь?

она никуда не денется после очередного коммита

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

ну это исключительно твоя проблема, запомни в какой микросервисе какая конвенция, не можешь — запиши

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

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

Ну и последнее — я бы не хотел работать с человеком в чьём профессиональном лексиконе есть фраза.

это исключительно твоя проблема
Общего в описанных ситуациях только слова большие и мелкие. Зачем ты вносишь в разговор вещи не относящиеся к обсуждаемой теме вообще?

общего тут больше, чем тебе кажется, ты пишешь что нужно делать что-то значимое, а на мелочь забить, а я тебе что это значимое состоит из тех самых мелочей

В смысле семантически не правильный? Про свойства операций слышал когда нибудь? Там.. симметричность к примеру?

в том смысле, что это нелогично. да. да.

я дам тебе пример проще, если и он не зайдет, то можно не продолжать. ассерт равенства у юнит теста содержит два параметра: ожидаемый и полученный, если ты их перепутаешь местами, то все равно будет правильно работать, но перепутать их местами — это ошибка

Ну.. тут не стану спорить, ни я ни наверно тот человек дот нета действительно не знаем. А тебе никогда не приходилось писать на языках, которых ты не знаешь?

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

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

не сложно сказать что просто отформатировал код, а не писал его

да и мне как-то не привычно отвечать за строчки кода, только весь компонент и если в нем есть белое пятно я всеми силами буду стараться это исправить, а не морозится: «хз что там, я не при делах, и не хочу в это лезть»

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

что ж с тобой будет, если еще и между тасками переключаться надо будет?

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

под проектом я имел ввиду одно приложение, точнее даже часть приложения написанную на одном языке, если ты говоришь не об этом же, то я не согласен

Даже если проявляется она только на мне.

если проявляется только на тебе, это только твоя проблема, ведь у других ее тогда нет =\

Ну и последнее — я бы не хотел работать с человеком в чьём профессиональном лексиконе есть фраза. это исключительно твоя проблема

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

не сложно сказать что просто отформатировал код, а не писал его

Расскажи это git blame

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

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

git blame дает время коммита.
gitk по времени коммита дает номер задачи, если есть правило в коммите его писать.
Багтрекер по номеру задачи дает описание проблемы и список коммитов по ней.
В результате часто понятно что делали и что можно поломать, и иногда даже понятно, зачем это делали.

общего тут больше, чем тебе кажется

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

в том смысле, что это нелогично. да. да.

В смысле не лочично? Операция равенсва обладает свойством симметричности, это не логично и не не логично, это грё-баный математический факт.

ассерт равенства у юнит теста содержит два параметра: ожидаемый и полученный,

Замечательный пример и опять не корректный. У параметров ассерта действительно есть разная семантика. Их порядок влияет на поведение. У параметров операции равенства такой разницы семантики нет.

Кстати, в моем теперешнем gtest-е первым идет ожидаемое значение, а в твоём?

что ж с тобой будет, если еще и между тасками переключаться надо будет?

Подозреваю что то же самое, что и с тобой. Человеческий мозг он как бы очень похож.

под проектом я имел ввиду одно приложение

А что вообще такое приложение в микросервисной архитектуре?

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

Проблемма не в колкостях. Проблемма в том, что такой вот настрой и подход к тиммейтам ну и вобще к людям с которыми у тебя какое-либо общее дело по-моему в принципе не приемлем. Это исключительно мое ИМХО.

мы действительно врятли договоримся, но у меня есть последний вопрос. Ты вообще в своей карьере заметно разные код конвеншены хоть раз юзал?

Подозреваю что то же самое, что и с тобой. Человеческий мозг он как бы очень похож.

тогда бы вот эта проблема была бы и у меня, у меня ее нет:

Во-первых да, действительно не могу, переключаясь между двумя микросервисами с разными код конвеншенами в границах одного таска иногда об этом забываю.
А что вообще такое приложение в микросервисной архитектуре?

приехали...

Проблемма в том, что такой вот настрой и подход к тиммейтам ну и вобще к людям с которыми у тебя какое-либо общее дело по-моему в принципе не приемлем.

ты не тиммейт, а очередной «тот, кто не прав в интернете», как и я для тебя

Ты вообще в своей карьере заметно разные код конвеншены хоть раз юзал?

да, в js

В смысле не лочично? Операция равенсва обладает свойством симметричности, это не логично и не не логично, это грё-баный математический факт.

В смислі математики рівняння пишуть
ax + b = 0
а не
0 = ax + b
хоча різниці ніякої. Просто так прийнято — конвеншн.

В смислі математики пишуть так, як зручно в данномуу конкретному випадку. То що ви написали пишуть на уроці математики в пятому классі. Вирішуючи реальну задачу є що написати з обох сторін знака рівності, а тілько потім той вираз приводиться до «нормальної форми»

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

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

Ну а я тебе собственно о чем говорю? Вот ты сам и придумал пример когда кодстайл уже не самая горячая проблемма.

И ещё одно. Есть какая-то разумная граница и усилий которые можно потратить на стандартизацию кодстайла и глубины насколько его нужно вообще стандартизировать.

Я считаю что к примеру спорить на тему как лучьше написать
if (something) continue;

if (something)
continue;

if (something) {
continue;
}

if (something)
{
continue;
}
просто безсмысленно. Сам предпочту вариант 2 но ни на один из этих вариантов в пулл-реквесте вообще не отреагирую.

Ну вот, а в Go таких проблем нет в принципе, там код-стайл формируется через консольную команду go fmt один для всех, и никаких споров-разногласий.

по-моему во всех языках есть автоформатирование

Ну а я тебе собственно о чем говорю? Вот ты сам и придумал пример когда кодстайл уже не самая горячая проблемма.

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

Сам предпочту вариант 2

1 и 2 вариант худшие, потому что непредполагают 2+ строки, придется два варианта всегда иметь и то добавлять, то удалять скобки, а вот как писать 3 или 4 зависит от языка, на котором пишешь

но ни на один из этих вариантов в пулл-реквесте вообще не отреагирую.

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

у каждого есть граница, когда он скажет: «ну это уже перебор», чем ты руководствуешься сдвигая ее?

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

Ну, если в твоем доме сорвана крыша, или разрушена стена то, что в нем грязно уже не имеет значения. Грязно тоже может быть по разному есть люди у которых пыль не вытерта, а есть люди которые срут прямо посреди комнаты на ковер. Жалобы, котрые мы обсуждаем выше — это жалобы на пыль, приподносятся они как жалобы на кал посреди общей комнаты, и зачастую происходит это в доме с сорваной крышей.

1 и 2 вариант худшие,

ну это твоё личное мнение.

потому что непредполагают 2+ строки

А это потому, что в примере выше нету никаких 2+ строк, там одна строка, один стейтмент.

придется два варианта всегда иметь и то добавлять, то удалять скобки,

И в чем тут ты видишь проблему? Ты это то же самый парень, который вчера предлагал административно ввести код конвеншен и перелопатить под него весь существующий код? А теперь тебе скобочки добалять-удалять сложно стало?

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

ну я понял что ты поощряешь разнородность в проекте, абы работало правильно,

Я поощряю? А вот с чего это ты взял? Я просто понимаю где граница того что стоит стандартизировать и того на что не стоит тратить время. Нету никакого профита с получасового спора о скобочках после иф.

но как далеко ты готов зайти?

Все приведённые тобой примеры приводят к реальным неудобствам. Таких вещей само собой надо избегать.

у каждого есть граница, когда он скажет: «ну это уже перебор», чем ты руководствуешься сдвигая ее?

Здравым смыслом? А есть ещё варианты?
Ещё мне не очень понятно в этом контексте слово «сдвигаешь». Оно само по себе предполагает, что есть какая-то «настоящая, объективная» граница и находиться она именно там, где её видишь ты, а я пытаюсь её поколебать. Я её не сдвигаю, я её провожу.

Ну, если в твоем доме сорвана крыша, или разрушена стена то, что в нем грязно уже не имеет значения. Грязно тоже может быть по разному есть люди у которых пыль не вытерта, а есть люди которые срут прямо посреди комнаты на ковер. Жалобы, котрые мы обсуждаем выше — это жалобы на пыль, приподносятся они как жалобы на кал посреди общей комнаты, и зачастую происходит это в доме с сорваной крышей.

=> по-твоему пыль это норма, кому-то и на ковер норма, на самом деле ни то, ни то не норма, а «сорваная крыша» не имеет отношения к делу

ну это твоё личное мнение.

вообще-то нет, это бест практисы от уважаемых людей

А это потому, что в примере выше нету никаких 2+ строк, там одна строка, один стейтмент.

у тебя получается два правила как писать иф, вместо одного

И в чем тут ты видишь проблему? Ты это то же самый парень, который вчера предлагал административно ввести код конвеншен и перелопатить под него весь существующий код? А теперь тебе скобочки добалять-удалять сложно стало?

перелопачивание делается без ручного вмешательства, а конвенция гарантируется статическим анализатором

Нормальный код конвеншен может как стандартизировать такую вещь, так вполне может и допускать вольности по этому поводу.

ага, единственное правило — отсутствие правил

В любом случае спорить по такому поводу — путая трата времени, а инфорсить свои личные предпочтения в такой мелочи на кого-то — просто глупость.

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

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

...и между конвенциями, и между проектами, и между задачами

Я поощряю? А вот с чего это ты взял? Я просто понимаю где граница того что стоит стандартизировать и того на что не стоит тратить время. Нету никакого профита с получасового спора о скобочках после иф.
Все приведённые тобой примеры приводят к реальным неудобствам. Таких вещей само собой надо избегать.

Здравым смыслом? А есть ещё варианты?
Ещё мне не очень понятно в этом контексте слово "сдвигаешь«.как и я написал в самом верху этого сообщения «для тебя пыль это нормально», есть «да» и «нет», «белое» и «черное», абсолютные величины, которые понятны, «чистый код» и «говнокод», вот ты сдвигаешь свою границу от чистого кода к говнокоду, утверждая что это здравый смысл, это не так, вон на форуме есть сумашедший тип, которы бд свою пилит, у него вплотную к говнокоду граница проходит, он себя точно также считает правым и называет это здравым смыслом

Оно само по себе предполагает, что есть какая-то «настоящая, объективная» граница и находиться она именно там, где её видишь ты, а я пытаюсь её поколебать.

граница есть, но она не между «хорошим» и «плохим»,

а одна между стороной, где «идеально хорошо» и реальностью и вторая между строной, где «идеально плохо» и реальностью

Я её не сдвигаю, я её провожу.

ты сдвигаешь идеал к реальности и стремитиься уже некуда

а «сорваная крыша» не имеет отношения к делу

Но как же это возможно

вообще-то нет, это бест практисы от уважаемых людей

Каких конкретно?
Я кстати свою позицию не сам придумал. Я вот конкретно на этих ребят ссылаюсь. Вполне себе уважаемые люди если что.
www.amazon.com/...​s-Practices/dp/0321113586

«для тебя пыль это нормально», есть «да» и «нет», «белое» и «черное», абсолютные величины, которые понятны, «чистый код» и «говнокод»

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

есть сумашедший тип, которы бд свою пилит, у него вплотную к говнокоду граница проходит

Откуда ты знаешь? Ты видел код его бд? Вдруг он у неё идеален? Само решение пилить свою дб странное, но разве это делает код говнокодом? Да у него там може быть внутри 100% идеальный по твоим стандартам код, теоретически. Ты опять мешаешь всё в кучу.

Каких конкретно?

слишком сложно... думаю кто-то из этих троих Макконел, Фаулер, Хант. я не запоминаю кто конкретно что написал, а искать ради пруфа я не буду

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

в этом нет ничего плохого, к тому же к себе я предъявляю требований во много раз больше чем к другим

Откуда ты знаешь? Ты видел код его бд? Вдруг он у неё идеален? Само решение пилить свою дб странное, но разве это делает код говнокодом? Да у него там може быть внутри 100% идеальный по твоим стандартам код, теоретически. Ты опять мешаешь всё в кучу.

вот случайный файл из его бд, это ответит на все вопросы github.com/...​Server/DniproDB_query.cpp

Сейчас придет trimm и скажет ,что Фаулер -говнокодер и его не надо читать.

Не. Не скажу. Фаулер дает много идей молодежи. Это ж не чистокодер Мартин, который в були не умеет. Для взрослых бесполезен, тк еси они не дошли к моменту взросления до идей фаулера, то и прочитать его не осилят, остальные и сами дошли.

Ща набигут рассказывать какой ты еретик и как им до усрачки важен SOLID и что без него корабли ентерпрайза никуда не полетят.

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

Тут скорее надо замерять период полупротухания кода на проектах разного размера с ним и без него. У меня нет данных по такому.
Энтерпрайз или легаси по солиду в 10М строк будет куда хуже, чем ковбойское что-то на 10К строк писанное на коленке джуном.

Тут скорее надо замерять период полупротухания кода на проектах разного размера с ним и без него. У меня нет данных по такому.

имхо рапределение будет равномерное

Энтерпрайз или легаси по солиду в 10М строк будет куда хуже, чем ковбойское что-то на 10К строк писанное на коленке джуном.

чем хуже? только не говори: «чем ковбойское что-то на 10К строк» :)

Тем что в 10М строк писанных разными людьми даже документация не особо помогает. И часто она фрагментарная и устаревшая. А 10К можно вычитать и попытаться понять.

тебе не нужны все 10м строк одновременно, а если все написано в монолит и одно тянет другое, то печаль беда

А 10К можно вычитать и попытаться понять.

это не всегда реально, я видел такое состояние малекого проекта что понять не удастся, более того он работал только при определенных обстоятельствах, которые достигнуть сложно было и даже не подебажишь

имхо рапределение будет равномерное

Если протухает одинаково быстро с солидом и без, то толку тогда от солида.

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

ну мат символов не будет, это система уравнений с плавающим количеством уравнений и количеством аргументов в них, а то что ты ключевые слова забанил немного усложняят дело...

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

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

по моему опыту это одна из важных составляющих «непротухания» когда вместо пихания всего и вся в одно место всё может и «так себе» но по крайней мере разложено чётко по отдельности и можно как анализ делать так и рефакторинг и какое-нибудь продолжение в т.ч.

Как только начали пихать всё вместе так сразу всё процесс пошёл.

еретик

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

слишком сложно... думаю кто-то из этих троих Макконел, Фаулер, Хант.

А ты вообще уверен, что они говорили именнто то, что ты «проповедуешь?». Необходимости стандартизации код конвеншенов не отрицает никто, из вменяемых людей. Но стандартизация не означает возводить это в культ и не означает цеплятся к любым мелочам. Книга которую я процетировал говорит что-то типа «стандартизируйте кодинг сандарты, но найдите разумную границу за которую идти не стоит»

в этом нет ничего плохого,

Есть, об этом можно спорить долго, но смысла я не вижу. Let’s agree to disagree.

А ты вообще уверен, что они говорили именнто то, что ты «проповедуешь?».

это ответ на вопрос про ифы без скобок vs ифы со скобками, так что да, уверен, эти варианты считаются хуже, чем аналоги со скобками

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

как я и писал статический анализатор кода на прекоммите с этим справится на ура, многие иде сразу делают скобки, а люди их затем удаляют, вот как бы перестанут

Книга которую я процетировал говорит что-то типа "стандартизируйте кодинг сандарты, но найдите разумную границу за которую идти не стоит«

если писать иначе автор дескредитирует себя перед частью читателей, к тому же обратного я тоже не говорил, на самом деле любой из вариантов сойдет, единственное условие чтобы не было других вариантов, у одного стиля слишком много преимуществ (быстрее ревью, ощущение что другие пишут как ты и это снижает количество мыслей про говнокод, а так же многое другое), чтобы как ты говоришь «из-за мелочи» отказываться от них

на самом деле любой из вариантов сойдет, единственное условие чтобы не было других вариантов,

Я вот с этим конкретно не согласен.
Я нормально переживу код в котором
if ()
return;

соседствует с

if () {
return;
}

Читабильности оно не мешает. Коммит хук инфорсящий кодстайл это ИМХО перебор в большинстве случаев. Исключение по-моему составляют только ну совсем уже запущенные случаи.

Я вот с этим конкретно не согласен.
Я нормально переживу код в котором

если твое мнение разделяет большиснтво, то окей, хоть так:

if
(
(
IsSmng
)
)
{
{
{
Foo();
}
}
}

увы, форматирование теряется, но на каждой строке случайное количество пробелов спереди

вот случайный файл из его бд, это ответит на все вопросы github.com/...​Server/DniproDB_query.cpp

Код как код, даже коменты есть. Завален свитчами и ифами — но может это файл такой попался, не везде же обработка текстовых запросов. Да, проще бы выглядело переписанное через таблицу команд и обработчиков, но может раньше так и было и тормозило, поэтому оптимизнули.

Код как код, даже коменты есть.

cs9.pikabu.ru/...​1/1485962407155371621.jpg

Завален свитчами и ифами — но может это файл такой попался, не везде же обработка текстовых запросов.

ну возьми другой рядом, там основных около 4х штук, они все одинаково написаны, разобраться в них мало кто может, в том числе и автор, которому много раз писали что оно не стартует/работает неправильно/валится в рантайме

В одну строчку легко пропустить при чтении, и затупить что цикл делает.

согласен, но есть интузиасты, которые и такое любят.

современный компилятор даёт на такое присваивание ворнинг.

Круті програмісти ніколи не принижуються до проглядання простирадла вонінгів.
І, в загалі, вонінги треба відключати на продакшн коді.

Від селфіплоїда чую!

-

-

Простирадла ворнінгів?
Вообщето нормальная практика в продакшен коде -Werror и энфорсить это CI

Нічого ви не розумієте...
Особливо сарказму.

Всьо фігня кроме пчьол я у продакшин коді відключав самих крутих програмістів що цікаво работає я провіряв.

Йодда, логинься пере, читаемость расскажи за кода и

такой код считается «smells» поэтому линтер вежливо намекнет что что-то не так

я конечно не спец по С++, но мне одному кажеться странным вот это:

int name;

как бы name всегда присваивают в String.

Не всем повезло с именем, у кого-то это ID :)

потому что присваивание. = != ==
а вообще прикольно что на ДОУ появились наконец-то посты про программирование :-)

Как мило выглядит, сразу первый курс вспомнился.

например, по незнанию англицкого очередным вайтишником

MSDN теперь есть на русском.

боже, куди котиться світ O.o :)

С автоматическим переводом же вроде

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

Старый добрый «непереводимый английский» был и проще к.м.к. и удобнее кстати с LI та же ж история людей «с русскими именами» можно смело игнорировать.

Загуглить номер ошибки != знание английского.

Вайтишники же по определению не могут учить плюсы. Так что давайте не обижать первокурсников :)

Проблема в том, что ООП и мета могут не начать изучать — это украина

could not convert char* to bool.

password = „art”

все логично он говорит

В подобных вопросах вам поможет StackOverflow. Верный ответ дал Александр Чмырь. Добавить нечего.

Один знак равно вместо двух.
Между прочим, самая распространенная ошибка в си-подобном синтаксисе.

Между прочим, самая распространенная ошибка в си-подобном синтаксисе

Скорее «ошибка, о которой наиболее часто говорят, что она самая распространенная». В реальном мире встречается редко

О ней наиболее часто говорят «ох ты ж б**» на стадии дебага))

У меня пролазит раз в пол-года. Можно предохраняться, если использовать cppcheck.

У меня С намного (в разы) быстрее пишется, так как думать не надо, как именно написать. А по результату, где быстрее реализуется логика — не знаю.
Когда баг вроде одинарного и двойного равно редко вылазит — лень против него что-то делать. Проще словить. когда вылез.
Утечки памяти ловит valgrind.

Большая часть описок ловится компилером и ассертами при попытке запуска. Ассерты еще и логические проблемы ловят.

да, в релизах тоже
wiki.c2.com/?OffensiveProgramming
суть в том, что мы везде на входе в функции и в ключевых точках алгоритмов проверяем валидность и консистентность данных. Соответственно, как только баг где-то в нашей логике, или память побилась, или в функцию пошли аргументы, которые ты не думал, что в нее можно передать, и которые она нормально не обработает, или когда метод класса вызван в момент, в который он не должен быть вызван — все падает с громкими матами и распечаткой стека вызовов.
Результат:
1) Программы почти не глючат. Они или работают, или падают. Да бывает, что где-то на верхнем уровне логики что-то недосмотрено, и действие пользователя теряется. Но Undefined Behaviour сводится почти к нулю.
2) Не нужны юнит тесты — программа тестит сама себя во время работы.
3) Ассерты показывают интерфейс функции и логику (какие значения параметров и состояния объектов допустимы) вместо коментариев.
4) Неожиданное состояние системы часто ловится очень близко к коду, который его вызвал.

Надо разделять внутреннюю и внешнюю логику. Внешняя логика (ввод пользователя, чтение из файла, сокеты) обрабатывается исключениями или if-ами. Как только мы ее распарсили и признали ввод валидным, у нас в нашем коде все должно происходить ровно так, как мы думали, когда его писали. И это все время везде проверяется ассертами.

Простой пример: надо упаковать дерево с листьями разной длины в непрерывную область память (например, для посылки по сети). Делается в 2 прохода: считаем размер памяти для упаковки, выделяем, потом копируем туда данные. Тут просится ассерт что после копирования данных мы дошли до конца выделенной памяти, то есть алгоритм расчета нужной памяти и алгоритм копирования дают одинаковый результат.

У меня С намного (в разы) быстрее пишется, так как думать не надо, как именно написать.

О, это известный прикол. Там где плюсовик напишет «class A» и начнет думать, сишник нарисует структуру, несколько функций преобразования и пачку оберточных макросов. Зато при этом сишник думать вообще не будет, а педалит на автомате и будет говорить, что это просто.

Кстати, не знаешь, в результате что лучше получается?

Там на выходе обычно получается один-в-один.

Макросы вообще не люблю — слишком много подводных камней.

Да ладно сворачивание внутренней кодогенерации до вменяемого читаемого «мета-» текста чистый же ж торт плюс избегание и упрощение поиска ошибок а какие там вообще «подводные камни» в макросах то?

Зависит от сложности объекта по факту на некотором условном пороге сложности (который не «линия» а скорее «пространство») знающий и понимающий человек уже сам может увидеть как «простой си» уже чисто технически становится «плюсами» включая полиморфизм и прочую ооп (кстати если кто не в курсе полиморфирм это паттерн просто в «плюсах» он реализован на уровне языка) включая например фактические исключения как реализация концепции try-final через goto и разворачивание стека как таковое с тем только что происходит это вручную а не автоматически когда за счёт конструкторов-деструкторов raii реализуется частично и во много на уровне языке и рантайма.

Например async-await вполне кошерный на коллбеках с ивентами и состояними только что требует некоторой базовой наработки и далее некоторого предварительного вникания мозгами после чего всё уже пишется обратно таки «не думая» как например запись std::string «плюсами» а между прочим это вообще-то std::basic_string только это узнаётся только в случае копать глубоко чего в свою очередь при нормально некриворуко написанном общем делать не приходится.

А меня лямбды вштырили. Есть какой-нить метод класса, в котором чтук 5 лямбд, в которых еще вложеные лямбды ... и все это работает с разными локальными переменными. Круче private. Ну и логика какого-то фрагмента — вот она — вся в 1 методе.
Еще круто, всякую логику, в зависимости от настройки в гуе, задавать массивом лямбд (или структур с лямбдами) — вот тебе и текст юзеру, вот тебе и обработчик, вот тебе что еще душа пожелает в 1 статик массиве. Всякие [](abrvalg) можно сократить макросом.

Зато как угрожать можно — «Уйду и будете весь мой код переписывать»

випердолять при першій нагоді, візьмуть пару джунін що перепишуть на Пайтоні

угрожалка не выросла...вы видели проект, писавшийся лет 17, в котором ни 1 локальной переменной, ни 1 параметра ф., только 300 глобалок вида i,j,k,n ? Вот такое массивами лямбд и чинить вместо 4 экранов if/elseif

у меня коллег никогда не было :) ...были «подчиненные», куда чтото аутсорсил, оставили плохие впечатления. Теперь один, всегда один :)

да ладно, скажите такой массивчик настроек не круто?

DECL_SEP(tr("Keywording„)),

DECL_SETT(GlobalStorableInt, „Trf3_KwPreview”, 150, tr("Keywording window’s previews sizes."),
tr("Changes sizes of the previews loaded from stock.„), 150, 350),

DECL_SETT(GlobalStorableBool, „Trf3_KwPreview2”, true, tr("Keep keywords entry field each time Keywording Window is opened."),
tr("If checked, Keywording Window will \"remember\" what you have entered last time during current session.„)),

DECL_SETT(GlobalStorableInt, „CachePreviewSize”, 500, tr("Keywording window’s cached pictures amount (more = more RAM). In effect after restart."),
tr("Sets how many pictures will be cached in RAM, so it will avoid downloading images.„), 50, 1500),

...потом 1 циклом все в гуе показывает галочками/комбиками, в соотв. с этим массивом юзеру.

Или вот фрагмент из „кодов ошибок”, лямбда опциональна

DECLARE_CODE(ERR_NEED_UPDATE, tr("Please update the program by doing restart of it."), true, [](const QString&){qApp->quit();}),

Конечно, там чтук 5 файлов разных шаблонови классов, и макросы. А потом все вот таким элегантным массивом описывается. Добавить че новое — 5 минут.

Кстати, макросы мне там нужны, потому что ERR_NEED_UPDATE должна быть И константой для С++, И строкой для интерпретатора. Чета я не знаю, как параметр шаблона токенизировать в строку :/ Думаю нельзя.

ну 5 я перегнул) вчера переписал всего 3) ...ну выходит так что, вызов из потока в гуй, потом снова другие потоки, и из потока нада снова гуй. В Qt это делается сигнал/слотом с параметром Qt::QueuedConnection — это гарантирует слот в гуе. Ну сделал ф. которая принимает лямбду и джампает ее в гуй. Итого вышло — лямбда потока — а в ней джампы в гуй (лямбды опять, т.к. им нужны указатели от потока, который лямбда на всякие промизы), а в 1 из гуев джамп в другой поток )). Зато нет кучи приватных членов класса и this не захвачен (потому что я захватывал weak_ptr, нет окна — нет гуя). В принципе окно можно убить, а потоки все равно сделают дело, а гуй проигнорируют.

Ну както так — вырезки, переменные по значению — шаред поинтеры

executor_keywords = Utils::startNewRunner([can_use_progress, this, sel_src](const Utils::runnerint_t& should_int)
{

emit callOnGui([this, &kw, pass, should_int, need_upd_kw, one_sel]()
{
if (!(*should_int))
{

ну...20 лет писали с приватными членами) и имели их списки на 2 экрана, особено в гуевых задачах). С лямбдами можно резко все сворачивать в пределах 1 функции-метода, все «приватные» описываются локальными шаред_птр в худшем случае. Ибо есть какая-то связка действий — нажал это, сделай то. Вот они связались в 2-3 лямбды и 4-5 шаредов и все. и все на 1 экране, вся логика этого действа конкретного.

Ну вот например

github.com/...​/master/previewsmodel.cpp

PreviewsModel::pickBests( поищите, буквально в 1 функции сложный многопоточный алгоритм...(это что я последнее делал и помню), а так там много еще с лямбдами заморочек.

в гуе не всегда можно, вы считали контролы? Вот ето все мемберы) + к ним нада запомнить какие-то «UserData», а можно сделать обработчик-лямбду и сразу эти самые «UserData» сразу захватить как константу.

Продублирую из пред. редактирование:

Ну вот например
github.com/...​/master/previewsmodel.cpp
PreviewsModel::pickBests( поищите, буквально в 1 функции сложный многопоточный алгоритм...(это что я последнее делал и помню), а так там много еще с лямбдами заморочек.

Не ну я их сам не люблю)
ну вот поточнее их почитать)

github.com/...​glob_statics_settings.cpp

Я их локализирую, делаю undef сразу, как уже не нужны (если в хидерах)
А для описания массива — они удобны. Меньше копипастить и быстрее фиксить чета, например, в предыдщем проекте (в этот еще не вошло), вставил дебуг версию с лямбдами, которые вертают нужное. А лямбды в статике проверяют уникальность ключа.
Вот так

#ifdef _DEBUG
//testing that all keys are unique
static std::set d_checker;
#define DECL_SETT(CLASS,KEY,DEF,args...) [&defRel, &defTempl]()->pair_t{(void)defRel; (void)defTempl; if (!d_checker.count(KEY)){d_checker.insert(KEY);return {KEY, {widgetted_pt(new CLASS(KEY,DEF,args)), __LINE__}};} FATAL_RISE("Dup key: " +std::string(KEY));}()
#else
#define DECL_SETT(CLASS,KEY,DEF,args...) {KEY, {widgetted_pt(new CLASS(KEY,DEF,args)), __LINE__}}
#endif

...тут у меня эти классы слегка различные ) в опенсорсе не успевает за оплаченым. Ну со временем добавлю...мб) еще не понятно как тут с лицензиями при 1 авторе)) (в оплаченом, как видно, сделал сортировку по порядку объявления в коде, в опенсорсе — по строке-ключу)

...а насчет говногуя...я его не придумываю, в платных проектах :) и слава Богу. Опенсорс вон встал, потому что самому себе удобно придумать никак не могу)

Фиг ее сделаешь в реальном мире. Особенно когда вокруг этого класса вся система крутится. И когда в проект хотя бы пару лет вкидываются требования.

чет не понял кого "

Фиг ее сделаешь

"

тут, кажется, дерево ответов тупит.

Декомпозицию класса, исторически обросшего деталями и костылями.

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

А размер в скомпилированном виде?

Чем этот код лучше темплейта?

ну если вы покопаете, то макрос токо генерит строковое название темплейта(для луа), а потом вызывает темплейт

Выглядит как обычный макрогенератор для настроек. Лямбды тут при чем?

в том. что это static SomeClassArray = {} внутри С++ кода, а на его основе уж гуй генерится при старте(в рантайм). Сходите по ссылкам чтоле.

оператор ‘=‘ вместо ‘==‘ в сравнении. Компилятор разве не выдаёт warning?

Ворнинг — в случае, если неявное преобразование типов прокатывает.

Всё сделал, но после того как ввожу имя, меня не спрашивает пароль, а просто выводит все строки( enter your password, неверный пароль). Вот скрин: drive.google.com/...​LcVMyc1E/view?usp=sharing
<blockquote>#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");
    string password;
    int name;
    cout << "Введите ваше имя: " << endl;
    cin >> name;
    cout << "Enter your password" << endl;
    getline(cin, password);
    if (password == "art") {
        cout << name << ", здравствуйте!";
    } else {
        cout << "*Неверный пароль";
    }
    cin.get();
    return 0;
}</blockquote>

Битый линк, и имя почему-то инт

запиши слово «арт» в переменную и сравнивай с переменной

Всё сделал, но после того как ввожу имя, меня не спрашивает пароль, а просто выводит все строки( enter your password, неверный пароль). Вот скрин: drive.google.com/...​LcVMyc1E/view?usp=sharing

#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");
    string password;
    int name;
    string passwordAnswer = "art";
    cout << "Введите ваше имя: " << endl;
    cin >> name;
    cout << "Enter your password" << endl;
    getline(cin, password);
    if (password == passwordAnswer) {
        cout << name << ", здравствуйте!";
    } else {
        cout << "*Неверный пароль";
    }
    cin.get();
    return 0;
}

Имя не может храниться в переменной типа инт.

Проблемму решил, она заключалась в этой строчке:

 <blockquote>getline(cin, password);</blockquote> 
и в том что имя хранилось в переменной типа int . Очень странно, объясните пожалуйста, что не так с той строкой, у парня на видосике всё получалось.

Я раньше занимался С+±репетиторством.
Что-то вроде 20$ час было, но это было давно.

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

Вопрос был в другом, но всё-равно спасибо ;)

1) if (password == "art") { «art» присваивать промежуточной переменной — не нужно, в классе string есть оператор сравнения с char*
2) name — тоже должен быть string, если это не целочисленный идентификатор.
3) текст получать надо лучше в буфер типа char* buffer[256], и следить за переполнением буфера.
4) пароли нельзя хранить в коде, это security fail, такие проги ломаются за 3 минуты в hex-редакторе. Если пароль — фиксированный, проверяй хэш пароля, например MD5, или лучше например SHA256.
5) setlocale не нужен, создаёт лишнюю путаницу со старыми никем не используемыми 8-битными кодировками. Вместо этого юзай unicode, то есть со строками работай так: wcout << L"Введите ваше имя: " << endl, строки — wstring, wchar_t*
6) ввод в консоль не везде может поддерживаться, так что получать данные лучше другими способами, например из файла. Ну например, если ты запустишь эту прогу в качестве тулзы в visual studio, она направит вывод в своё окно output, а читать естественно не будет.

Тільки wchar_t теж має свої хохмочки, які, як на мене, роблять його практичне використання незручним до того, що воно стає не потрібним. Воно compiler dependent і по факту UTF16 під він і UTF32 під лінухом. UTF16 — varying length, UTF32 — fixed. Купа бозна яких методів, отой дурнуватий L (ще й _T бува починають ліпити). Коротше як на мене простіше юзати UTF8 для локалізації, і мати звичайні char та методи і забути про wide char. Так, маємо varying length і пов’язані з цим неприємності, але віндовий UTF16 — теж насправді такий. setlocale бува є сенс ставити хіба що англійську, бо можна отримати хохмочки на кшалт коми як floating pointer delimiter і фейл завантаження конфігу під різними локалізаціями)

Це все допоки тобі не трапиться задача з case insensitive сортування...

А чим вона особлива і чим wchar рятує?

Тому що для сортування UTF-8 за алфавітом доводиться використовувати mbsrtowcs + wcsncasecmp або тягнути здорові бібліотеки, або тиждень розбиратись як ті бібліотеки порізати.

В любом случае нужно тащить collation rules — в разных языках немного разные порядки букв в алфавите.

Во-вторых, даже с UTF-16/UTF-32 можно наломать дров нормализации юникодовых строк (ту же «й» можно в юникоде представить двумя различными путями).

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

базовые collation rules есть в libc, именно их и юзают эти функции. А тащить либу в эмбедед — как бегемота из болота..

Так, знадобиться ліба для роботи з utf8, вже щоб літери малювати. Не страшніше частини STL з widestring функціями. Все одно буде ліба для локалізації, якщо цим серйозно займатися.

Хай клієнтський пристрій сам малює.

Типа с обычной сортировкой всё просто — постоянно вижу Івано-Франківську область в начале списка

Воно compiler dependent і по факту UTF16 під він і UTF32 під лінухом. UTF16 — varying length, UTF32 — fixed.

Да, есть такой нюанс, поэтому зачастую юзается макрос WCHAR, который расширяется в 16-битное число под виндой, и в int под Mac и другие платформы. Под виндой используется урезанный вариант UTF-16, то есть USC-2, с постоянной длиной. Этого сета хватает для всех практических задач, чтобы писать тексты на любых современных языках. UTF-8 юзать удобнее всего, но при этом нужно учитывать, что все вызовы нэйтивного WinAPI под NT4/XP и выше — юзают 16-битный юникод.

Рискну предположить, что «cin >> name;» оставляет ньюлайн в буфере ввода, и его молча подхватывает getline в качестве терминатора ввода — как типа если бы ты сам нажал энтер в ответ на запрос о вводе пароля. Ну и естественно пустой пароль дальше не матчится с дефолтным, и досвидос. Только версия, так как кресты сто лет в глаза не видел, а проверять ленюсь :)

Учись дебажить свой код. Говорят, помогает...

Скорее то, что он вводит в качестве name потом частично оказывается в password и вызывается else блок. cin >> name не может в инт засунуть строку. и потом всё до \n пойдёт в password.

Вообще-то я так понял (по его «Вопрос был в другом» — тренирую скилл чтения мыслей вынтернетах :)), что он сначала исправил объвление name, и потом уже пробовал с getline — и оно у него не работало, сваливаясь в else ветку...

не вижу нигде, чтоб объявление name было исправлено и он сам написал, что была проблема с переменной типа инт. а вообще у него выражение мыслей такой сумбурное, что я вертела на одном месте чтение таких мыслей)))

Здесь: dou.ua/...​rums/topic/22083/#1207440
Он уже понял про тип, но с гетлайн все равно не завелось... А может и нет, там и правда фиг поймешь...

Так я думаю, что он поправил инт на строку, у него правильно стало читаться name из консоли, и тогда правильно стал читаться password getline-ом

Я даж не поленилась, проверила, там ещё \n остаётся даже если сделать name строкой просто, нужно или его скипать сознательно или так же гетлайном считывать

В том, что при попытке ввести строку в число взводится флаг ошибки и все остальные попытки чтения из cin игнорируются.

И да, завязывай со скриншотами, 21 век на дворе: Live Demo

Підписатись на коментарі