На основании вашего обновленного запроса, запрашивая условие выхода, я изменил код. Обратите внимание, что я использовал getline(cin, answer)
для обработки ввода. Я использую getline (), потому что у меня меньше шансов запутаться, когда я использую getline()
вместо cin >> answer
.
Обратите внимание, что getline (cin, answer) делает несколько вещей для вас:
blockquote>
- Возвращает true, если вход был получен
- Заполняет ответ
[ 1110] Получает всю строку, пока пользователь не предоставит новую строкуТаким образом, строка
while (std::getline(std::cin, answer) && answer != "n")
получит всю книгу, даже если есть пробелы. & Amp; & amp; позволяет проверить ответ для «n» перед входом в тело цикла while. Поскольку ответом являетсяstd::string
, сравнение проводится с"n"
, а не с'n'
.Если это работает для вас, пожалуйста, примите ответ. Удачи!
#include <iostream> #include <string> #include <iomanip> // setprecision int main() { std::string bookname[5] = {"STPM BOOKS", "SPM BOOKS", "PMR BOOKS", "TEXT BOOK", "PRACTICAL BOOK"}; float price[5] = {30.90, 24.90, 19.90, 45.90, 15.90}; std::string answer; float cost; std::cout << "Please provide the name of a book or type 'n' to exit" << std::endl; // get one line into answer, and also exit while if answer is "n" while (std::getline(std::cin, answer) && answer != "n") { bool found = false; for (int i = 0; i < 5; i++) { if (bookname[i] == answer) { std::cout << "The book " << bookname[i] << " costs $" << std::fixed << std::setprecision(2) << price[i] << std::endl; found = true; break; // /no need to continue inside the for loop } } // on last loop, give up if (!found) { std::cout << "The book " << answer << " is not in our inventory" << std::endl; } } }
На CocoaDev имеется достойное описание того, что делать.
В общем, вы захотите использовать API в LaunchServices / LSSharedFileList.h, если сможете целевой Mac OS X 10.5 или более поздней версии. До 10.5 не было чистого API, поэтому вы должны вручную манипулировать элементами входа в систему (Пример кода в Developer Connectiong ).
Вот пример кода (dead) для леопарда я упоминал в комментариях. Найдено в в этом блоге . Код, который необходимо включить или отключить при входе в систему, находится на сайте Controller.m.
Вызовите метод, вставленный ниже, с URL-адресом файла, указывающим на ваше приложение, чтобы добавить его к элементам входа текущего пользователя.
Чтобы отключить снова, вам потребуется получить тот же loginListRef, преобразуйте его в массив и итерируйте по нему, пока не найдете элемент с URL-адресом, который хотите отключить. Наконец, вызовите LSSharedFileListItemRemove с соответствующими аргументами.
Удачи:)
- (void)enableLoginItemWithURL:(NSURL *)itemURL
{
LSSharedFileListRef loginListRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginListRef) {
// Insert the item at the bottom of Login Items list.
LSSharedFileListItemRef loginItemRef = LSSharedFileListInsertItemURL(loginListRef,
kLSSharedFileListItemLast,
NULL,
NULL,
(CFURLRef)itemURL,
NULL,
NULL);
if (loginItemRef) {
CFRelease(loginItemRef);
}
CFRelease(loginListRef);
}
}
См. Также вопрос SO: Зарегистрироваться как логин пункт с какао
Вот код, который я использую, он основан на исходном коде Growl.
+ (BOOL) willStartAtLogin:(NSURL *)itemURL
{
Boolean foundIt=false;
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginItems) {
UInt32 seed = 0U;
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
for (id itemObject in currentLoginItems) {
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
CFURLRef URL = NULL;
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
if (err == noErr) {
foundIt = CFEqual(URL, itemURL);
CFRelease(URL);
if (foundIt)
break;
}
}
CFRelease(loginItems);
}
return (BOOL)foundIt;
}
+ (void) setStartAtLogin:(NSURL *)itemURL enabled:(BOOL)enabled
{
OSStatus status;
LSSharedFileListItemRef existingItem = NULL;
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
if (loginItems) {
UInt32 seed = 0U;
NSArray *currentLoginItems = [NSMakeCollectable(LSSharedFileListCopySnapshot(loginItems, &seed)) autorelease];
for (id itemObject in currentLoginItems) {
LSSharedFileListItemRef item = (LSSharedFileListItemRef)itemObject;
UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
CFURLRef URL = NULL;
OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &URL, /*outRef*/ NULL);
if (err == noErr) {
Boolean foundIt = CFEqual(URL, itemURL);
CFRelease(URL);
if (foundIt) {
existingItem = item;
break;
}
}
}
if (enabled && (existingItem == NULL)) {
LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
NULL, NULL, (CFURLRef)itemURL, NULL, NULL);
} else if (!enabled && (existingItem != NULL))
LSSharedFileListItemRemove(loginItems, existingItem);
CFRelease(loginItems);
}
}
Если вам нужен простой в реализации флажок, сделайте @property BOOL startAtLogin;
в одном из ваших классов и реализуйте его следующим образом. Просто привяжите значение флажка к свойству, и все должно работать без проблем.
- (NSURL *)appURL
{
return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
}
- (BOOL)startAtLogin
{
return [LoginItem willStartAtLogin:[self appURL]];
}
- (void)setStartAtLogin:(BOOL)enabled
{
[self willChangeValueForKey:@"startAtLogin"];
[LoginItem setStartAtLogin:[self appURL] enabled:enabled];
[self didChangeValueForKey:@"startAtLogin"];
}