• Почему добавляется лишний символ в массив?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы не копируете '\0' на конце. Поэтому после приписывания идет мусор. И так получается, что у вас в памяти там мусор "v\0".

    Вторая проблема, вы пишите в строку s, не меняя ее размер.
    char s[] = "abc"; выделяет ровно столько памяти, сколько нужно для "abc", да еще и на стеке, раз у вас переменные локальные.

    Вы при дописывании чего-то к строке затираете другие переменные. Так у вас совпало, что после name идет surname на стеке. Поэтому вы переписываете память второй строки (но без первого символа, который занял место '\0' в name. Именно поэтому мусор в конце - это неперезаписанный конец surname "v\0". Если поменять местами переменные, то вы может стек перепишите и у вас программа вообще упадет.

    Вам надо строки выделять с запасом: char name[1000] = "Ivan";
    Ответ написан
    Комментировать
  • Почему добавляется лишний символ в массив?

    15432
    @15432
    Системный программист ^_^
    после
    for (; *t != '\0'; t++)
          *s++ = *t;

    добавьте
    *s = '\0'

    чтобы строчку завершить

    но вообще у вас переполнение буфера идёт, за рамки массива вылезаете при копировании. Обратите на это внимание и выделяйте память динамически.
    Ответ написан
    Комментировать
  • Почему добавляется лишний символ в массив?

    vabka
    @vabka
    Токсичный шарпист
    У вас память накладывается.
    Условно до вызова функции память выглядит так:
    Ivan \0Golubkov\0
    А после:
    Ivan Golubkovv\0
    Посмотрите, что творится с переменной surname и убедитесь

    Чтобы это исправить надо либо для name выделять заранее память побольше, либо при склеивании выделять новую память и возвращать на неё указатель.

    PS: Если не играться в "кто меньше строк напишет", то вот так будет гораздо понятнее:
    void append_str(char* first, char* second) {
      char* end_of_first = first;
      while(*end_of_first != '\0') {
        end_of_first++;
      }
      char* current = second;
      while(*current != '\0') {
        *end_of_first = *current;
        end_of_first++;
        current++;
      }
      *end_of_first = '\0'; // Самое важное
    }
    Ответ написан
    Комментировать
  • Почему этот код на С является рабочим?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что результатом операции присваивания является присвоенное значение.
    А 0 приводится к false.
    Ответ написан
    3 комментария
  • Неправильно сравниваются массивы в Си, почему?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У вас переменные correct_Login и correct_Password не инициализируются. Вы их можете затереть в 0, но 1 они никогда не были и не станут.

    Теперь несколько замечаний по коду.

    Не нужно декларировать extern в коде функции для глобальных переменных. Не нужно дописывать '\0' на конце строковых констант, оно там и так будет в конце добавлено автоматически.
    Ответ написан
    1 комментарий
  • Неправильно сравниваются массивы в Си, почему?

    bingo347
    @bingo347
    Crazy on performance...
    Данное условие никогда не выполнитсяif (correct_Login == 1 && correct_Password == 1)

    Ну и почитайте на досуге: https://habr.com/ru/post/491534/
    Ответ написан
    1 комментарий
  • Как при помощи bat-файла запустить программу python и ввести данные в нее?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Конечно возможно. У меня сейчас винды под рукой нет, но выглядеть будет примерно так.
    Программа, назовём её my_python_script.py:
    x = input()
    print('Text from input:', x)

    Батник:
    echo the string for python | python my_python_script.py

    Если инпутов несколько, то передать нужно несколько строчек.
    Чтобы сделать это с помощью echo, нужно написать строку с абзацем внутри. Я понятия не имею как экранируется абзац в bat-файлах, поэтому могу предложить такой вариант.
    my_python_script.py:
    x = input()
    y = input()
    z = input()
    rest = []
    while z != 'END':
        rest.append(z)
        z = input()
    
    print('x=', x, 'y=', y)
    print('rest=', rest)


    my_script.bat:
    echo The X string
    echo The Y string
    echo Other string 1
    echo line 2
    echo line 3
    echo line 4
    echo END

    Вызываем так:
    my_script.bat | python.exe my_python_script.py
    Весь выхлоп из батника попадёт на вход питоновского скрипта.
    Можно сделать еще один батник, который сделает такой вызов. Можно описать подпрограмму внутри батника, которая будет печатать строчки и в том же батнике её вызвать пайпом с передачей питону.

    Пайп - это такой виртуальный файл в операционной системе, который можно либо читать, либо писать. либо и то и другое. Зависит от того как сделан пайп. Для каждой программы система при запуске создаёт три пайпа: stdin, stdout, stderr.
    С помощью `|` в командной строке между командами можно сделать конвейер, когда выхлоп левой команды в stdout направляется на вход правой команды в stdin. Таким паровозом можно сколько угодно команд соединить.
    С помощью `>` можно перенаправить stdout в локальный файл с заданным именем:
    echo text to write into the file > the_file.txt
    С помощью `<` можно в stdin передать содержимое файла.
    Там много всяких хитростей с этими перенаправлениями, но лучше почитайте профильную статью или документацию.
    Питон читает с помощью input() из stdin и по умолчанию пишет с помощью print в stdout. echo в bat-файле тоже пишет в stdout.
    В линуксе (и в винде, если поставить поддержку шелла) есть куча других полезных команд и утилит для работы в командной строке (cat, tee, ...)
    Ответ написан
    7 комментариев