#c #c 11 #pointers
#c #c 11 #указатели
Вопрос:
Напишите функцию char* findx(const char* s, const char* x), которая находит первое вхождение строки x в стиле C в s. Не используйте никаких стандартных библиотечных функций. Не используйте подписку; вместо этого используйте оператор разыменования * .
Для моих текущих целей я использую ограничения приглашения довольно свободно. В настоящее время у меня есть очень грубый код для поиска вхождения строки, но у меня возникли проблемы с арифметикой указателей, чтобы иметь возможность выводить соответствующее слово. Из-за того, как я построил свой цикл for , в выводе отсутствует первая буква. Кроме того, я использую переменную вне моего цикла for для увеличения моего указателя, чего я хочу избежать. Есть идеи о том, как я могу это улучшить? Я знаю, что есть лучшие способы подойти к этому, но я хотел посмотреть, смогу ли я улучшить это без существенного изменения цикла for .
const char* findx(const char* s, const char* x)
{
int size = strlen(s);
int size1 = strlen(x);
int n = 1;
for (const char* p = amp;s[0]; p < amp;s[size]; p) {
if (*p == *x) {
for (const char* j = amp;x[1]; j < amp;x[size1]; j) {
if (*j == *(p n)) {
cout << *j;
n;
}
}
}
}
return nullptr;
}
Комментарии:
1. «Не используйте подписку» , поэтому замените
amp;s[size]
наs size
.2. Пока вы ждете ответов, я предложу пару предложений, чтобы сделать код более читаемым.
size
иsize1
сбивают с толку имена переменных. Было бы понятнее, если бы их имена отражали их назначение, например, что-то вродеsizeS
иsizeX
. Аналогично, именаp
иj
немного сбивают с толку; ‘j’ обычно используется для индексации, и снова имена не отражают их назначение. Наконец,amp;s[0]
это просто ‘s’, и вы можете использовать арифметику указателей вместо индексации для других значений. Внесение некоторых изменений в эти строки может упростить анализ кода.3. Эта ссылка для
std::search
обеспечивает возможную реализацию.4. Я бы предположил, что целью наличия
const char *
возвращаемого типа является возврат указателя на строку, если она найдена. Вы только возвращаетесьnullptr
.5. Не могли бы вы добавить пример с текущим поведением и ожидаемым поведением?