Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Объясните спецификатор

#c


Использовал в scanf спецификатор " %[^\r\n]" для того, чтобы мог вводить название
из нескольких слов,отделенных пробелами.(посоветовали так же на форуме это спецификатор
использовать), но как его объяснить.Почему в квадратных скобках?
Что означает "^" крышечка? 
Коротко говоря подробно написать саму работу данного спецификатора.
    


Ответы

Ответ 1



Читайте документацию по scanf, там все подробно написано. Спецификатор формата вида %[что-то] означает "читать все символы, пока они принадлежат набору, указанному в квадратных скобках". Спецификатор формата вида %[^что-то] означает "читать все символы, пока они НЕ принадлежат набору, указанному в квадратных скобках" (т.е "читать все символы, пока не наткнешься на один из указанных в квадратных скобках"). В вашем случае " %[^\r\n]" означает: пропустить ведущие пробелы и затем читать все подряд, пока не наткнешься на '\r' или '\n'. Вообще-то, если речь не идет о каких-то тонкостях, связанных с обработкой символа '\r', scanf с форматом " %[^\r\n]" означает просто "пропустить ведущие пробелы и затем читать до конца строки", при этом оставляя символы конца строки непрочитанными. Это примерно то же самое, что и обычный fgets, с той только разницей, что fgets не пропускает ведущие пробелы и вычитывает из потока символы конца строки. Может быть вам лучше подойдет просто fgets и не надо городить огород с этим %[]? Также не ясно, зачем понадобилась отдельная обработка символа '\r'. Если речь идет о чтении текстового потока под Windows, то там никакого '\r' уже не будет. Все маркеры конца строки будут заменены на простое '\n' еще до того, как дело дойдет до scanf. Также имейте в виду, что scanf не умеет читать пустые строки. То есть если этот %[^\r\n] сразу же наткнется на '\r' или '\n', то scanf тут же завершится с ошибкой, не изменив значение принимающего буфера.

Не могу подключить namespace используя autoload

#php #namespace


Класс Autoload.php подключает в проект все имеющиеся .php-файлы. Не могу использовать
пространство имен какого-либо файла, если он подключен через Autoload. 

Ручное подключение файла (используя require/include) и подключение его namespace
работает без ошибок. 

Autoload.php:


Ответы

Ответ 1



У вас $class_name передается как полное имя класса вместе с пространством имен. И вот на этом этапе $path = ROOT . $path . $class_name . '.php'; у вас получается что-то вроде ROOT.'/models/Admin\\Auth.php' А такого файла у вас скорее всего нет

Ответ 2



можно еще так str_replace('\\', '/', __NAMESPACE__); , хотя в вашем случае нужно только короткое имя класса. Интересно что namespace обязательно должен присутствовать в файле класса, а доступ к нему производится или установкой пространства имен или указанием полного имени класса или имени класса относительно установленного пространства имен. Ниже загрузчик, код не мой, но я проверял он вполне рабочий. Нужно только загрузить сам загрузчик, выше него естественно указать желаемое пространство имен, и дальше уже работать непосредственно с классами и их функциями. Загрузчик AutoPSR-4.php test(); Z\Zed::test(); //расположен в models\Z\Zed.php \controllers\Xclass::test(); // расположен вне текущего пространства имен в controllers\Xclass.php Пример класса controllers\Xclass.php класс Xclass'; } }

Ответ 3



Автозагрузчик composer`a. Подключение через композер, предполагает запихивание всего апликейшена в папку, связывание с именем проекта, а следовательно все неймспейсы приобрели дополнительный префикс \Проект, и стал выглядеть подобным образом \Проект\сабнеймспейс\класс, т.е. нужно для нормального функционирования, переименовывать во всех файлах проекта пространство имен, внедряя имя проекта, но чтобы не менять в глубинах кода используемые классы, можно добавить указатель на пространство имен use. Теперь в начале каждого класса пишем используемое пространство имён. У основных классов это:

Как git работает со ссылками

#git #gitlab


Здравствуйте.
Мне нужно завести проект в gitlab. В проекте есть symlink'и как на директории так
и на файлы. Мой вопрос такой, как git работает со ссылками? Имеет ли значение идет
ссылка на файл или директорию? Если я хочу добавить их в .gitignore, мне просто добавлять
их как конкретные файлы?
    


Ответы

Ответ 1



git сохраняет symlink так же как файл в blob. При checkout он создаст его как symlink и не важно есть ли оригинальный файл/директория. Вы можете добавить их в .gitignore как простые файлы по имени.

Какие коды ошибок возвращать в rest?

#java #http #rest


В задании написано вернуть коды ошибок типичные для rest. Какие именно? Какие коды
являются типичными для rest?
    


Ответы

Ответ 1



Типичные для REST это ошибки 200 - успешные 400 - ошибки на стороне клиента 500 - ошибки на стороне сервера

Как изменить цвет поисковой строки в мобильном Google Chrome

#html #google_chrome


Мне надо сделать цветной панель поиска в Google Chrome, например, как у лайфхакера:



Пробовал сделать это с помощью




Но увидел всю ту же белую панель.



Помогла чистка кэша


    


Ответы

Ответ 1



У лайфхакера в коде стоит: Может Вы не туда тег вставили? Это нужно между добавить. Так же, возможно, Вам нужно почистить кэш браузера в телефоне.

перехват исключения производным классом

#cpp #ооп #классы #исключения


Объясните почему при вводе 0  и выбросе исключения Base, оно не отлавливается блоком
Derived1?

int main()
{
    int number = 0;

    for (;;)
    {
        try
        {
            cin >> number;
            cout << number << " ";

            switch (number)
            {
                case 0:
                    throw Base();

                case 1:
                    throw Derived1();

                case 2:
                    throw Derived2();
            }
        }
        catch (Derived1 /*exception*/)
        {
            cout << "Exception of derived class" << endl;
        }
        catch (Base /*exception*/)
        {
            cout << "Exception of Base class" << endl;
        }
    }

    return 0;
}

    


Ответы

Ответ 1



Потому что Base не является Derived, а вот Derived является Base. Вот если бы вы написали (кстати, перехватывайте исключения по ссылке, иначе столкнетесь со срезкой) catch (Base& /*exception*/) { cout << "Exception of Base class" << endl; } catch (Derived1& /*exception*/) { cout << "Exception of derived class" << endl; } то тут и Base, и Derived ловились бы первым блоком - Base.

Создать полоску клеток вверху сайта

#html #css


Как можно сделать полоску клеток вверху сайта? Я пытаюсь делать таким кодом



header {
  background: linear-gradient( #bbb, transparent 1px), linear-gradient( 90deg, #bbb,
transparent 1px);
  background-size: 15px 15px;
  background-position: center center;
  height: 100px;
}
Но тогда остаются зазоры по бокам. Как можно сделать, чтобы клетка прижималась к верхнему и боковым краям без зазора?


Ответы

Ответ 1



Для body надо сбросить margin, body { margin:0px; }

Ответ 2



А если просто добавить бордер?: header { background: linear-gradient( #bbb, transparent 1px), linear-gradient( 90deg, #bbb, transparent 1px); background-size: 15px 15px; background-position: center center; height: 100px; border:1px solid #ddd; } div { background: linear-gradient( #bbb, transparent 1px), linear-gradient( 90deg, #bbb, transparent 1px); background-size: 15px 15px; background-position: 0 0; height: 90px; border-right:1px solid #ddd; border-bottom:1px solid #ddd; }