Вопрос касательно указаттелей в задаче из codewars
Пожалуйста помогите!
Я решал задачу про "поиск иголки в мусоре" на codewars. Cамостоятельно решить не получилось и я решил посмотреть решения других участников. В результате, возникли вопросы по поводу указателей.
Условие:
Напишите функцию findNeedle(), которая принимает array полный мусора, но содержит один"needle"
После того, как ваша функция найдет иглу, она должна вернуть сообщение (в виде строки), в котором говорится:
"found the needle at position "плюс index нашел иглу, так что:
Пример (Input --> Output)
["hay", "junk", "hay", "hay", "moreJunk", "needle", "randomJunk"] --> "found the needle at position 5"
Примечание. В COBOL он должен возвращать "found the needle at position 6"
Вопросы:
1й вопрос: почему метод find_needle принимает указатель на указатель const char** haystack, а не const char* haystack?
2й вопрос: почему в данной строке if (!strcmp(haystack[i], "needle")) нет вот такого разыменования: *haystack[i] ?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
char* find_needle(const char** haystack, size_t count)
{
for (int i = 0; i < count; ++i)
{
if (!strcmp(haystack[i], "needle")) // strcmp will return 0 if true, so we need '!' to it to work
{
char* buff = malloc(36);
sprintf(buff, "found the needle at position %d", i);
return buff;
}
}
}
int main() {
const char* haystack[] = { "3", "123124234", "None", "needle", "world", "hay", "2", "3" };
char* received = find_needle(haystack, sizeof(haystack) / sizeof(haystack[0]));
printf("%s",received);
}
Я новичек в программировании на си, поэтому для меня есть много еще не очевидных моментов, спасибо всем, кто придет на помощь!
Ответы (2 шт):
1й вопрос: почему метод
find_needleпринимает указатель на указательconst char** haystack, а неconst char* haystack?
Потому что в функцию передается весь массив, а const char* - это тип элемента массива haystack, а не самого массива (указателя на первый элемент).
2й вопрос: почему в данной строке
if (!strcmp(haystack[i], "needle"))нет вот такого разыменования:*haystack[i]?
Потому что haystack[i] — это элемент массива, который содержит указатели на const char, т.е. по сути строки в представлении С. То, что предлагаете вы — *haystack[i] — это первый символ строки, на которую указывает haystack[i].
char- символ,char*- указатель на начало строки,char**- указатель на начало массива строк. У вас в функцию должен передаваться указатель на массив, если вы хотите перебирать его в функции.- по той же причине здесь нет разыменования. Если вы попытаетесь сделать подобного рода разыменование, то получите символ i-ый символ первой строки в массиве, а для работы
strcmpнужна именно строка.haystack[i]- и есть строка массива, которая обрабатывается в данный момент