Функция нарушается несколькими способами.
Вот исправленная версия:
int myStrStr(const char *haystack, const char *needle, char *buffer) {
if (*needle == '\0') {
/* special case for empty needle: return success with an empty match */
buffer[0] = '\0';
return 1;
}
for (; *haystack != '\0'; haystack++) {
if (*haystack == *needle) {
buffer[0] = *haystack;
for (size_t i = 1;; i++) {
buffer[i] = needle[i];
if (needle[i] == '\0')
return 1;
if (needle[i] != haystack[i])
break;
}
}
}
buffer[0] = '\0';
return 0;
}
Обратите внимание, что копирование совпавшей строки во время сканирования не является необходимым, было бы достаточно скопировать иглу, когда совпадение найдено. На самом деле, содержание buffer
представляет собой либо пустую строку, либо копию needle
: не очень полезный побочный эффект.
Вместо
:prompt => "Select a State/Province"
попробуйте
:allow_blank => "Select a State/Province"
РЕДАКТИРОВАТЬ: Да, после проверки API я вижу, что я запутался В соответствии с документацией, приглашение - это правильный путь, может ли так случиться, что он появляется только потому, что у вашего объекта уже есть значение, и поэтому подсказка есть, но это не текущее выбранное значение в раскрывающемся списке ??? 114620]
: include_blank
со значением вашего пустого параметра, похоже, Покажи фокус. Попробуйте следующее:
{:include_blank => "Please select"}