Проблема с вашим исправленным кодом заключается в том, что index
находит только первый вхождение заглавной буквы в строке. Поскольку вы повторяли экземпляры с одинаковыми заглавными буквами, функция никогда не находит последующие экземпляры. Вы можете упростить свой подход и избежать этой проблемы, просто объединяя буквы с подчеркиванием или без подчеркивания, в зависимости от того, являются ли они заглавными буквами при итерации.
Например:
def underscore_caps(s):
result = ''
for c in s:
if c.isupper():
result += f'_{c.lower()}'
else:
result += c
return result
print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d
Или немного более кратко, используя понимание списка и join
:
def underscore_caps(s):
return ''.join([f'_{c.lower()}' if c.isupper() else c for c in s])
print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d
Когда Вы пишете программу WinMain, Вы автоматически получаете опцию SUBSYSTEM / быть окнами в компиляторе. (Принятие Вас использует Visual Studio). Для любого другого компилятора могла бы присутствовать подобная опция, но имя флага могло бы отличаться.
Это заставляет компилятор создавать запись в формате исполняемого файла ( формат PE), который отмечает исполняемый файл как исполняемый файл окон.
, Как только эта информация присутствует в исполняемом файле, системный загрузчик, который запускает программу, будет рассматривать Ваш двоичный файл как исполняемый файл окон и не консольную программу, и поэтому это не заставляет консоли автоматически открываться, когда это работает.
, Но Windows-программа не должен создавать окна, если она не должна хотеть, во многом как все те программы и сервисы, что Вы видите выполнение в панели задач, но не смотрите соответствующие окна для них. Это может также произойти, если Вы создаете окно, но решили не показать его.
Все, что необходимо сделать, для достижения всего этого,
#include <Windows.h>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
/* do your stuff here. If you return from this function the program ends */
}
причина Вы требуете, чтобы сам WinMain был то, что, как только Вы отмечаете подсистему как Windows, компоновщик предполагает, что Вашей функцией точки входа (то, которое называют после загрузок программы и библиотеки C Run TIme, инициализирует) будет WinMain и не основная. Если Вы не обеспечите WinMain в такой программе, то Вы получите неразрешенную ошибку символа во время процесса соединения.
окна In:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// <-- Program logic here
return 0;
}
убедиться использовать ключ компоновщика ПОДСИСТЕМЫ/, как упомянуто Adam Mitz.
На других платформах:
int main(int argc, char**argv)
{
// <-- Program logic here
return 0;
}
Если вам нужно непрерывно запустить вашу программу без консоли или окна, вы можете найти полезные deamon в * NIX или службах в Windows , этот пример .NET, если вам нужно обычный win32 просто погуглите немного для примера.
Так как ваш вопрос помечен как win32, я предполагаю, что услуги более актуальны для вас.
Используйте мастер Visual Studio для создания приложения Win32. Но не создавайте окно, т.е. вы удаляете функцию создания окна. В качестве альтернативы мы можем создать приложение Win Service.
Если вы используете MSVC или Visual Studio , просто используйте новый Project Wizard и выберите Консольное приложение .