Поиск совпадения в двухмерном массиве
- Войдите на сайт для отправки комментариев
Вс, 19/12/2021 - 01:24
Подскажите пожалуйста, есть ли какая-то готовая функция поиска символов в двухмерном массиве?
То есть проверки совпадения последовательности, например из 4 символов.
char input_number[] {"6390"}; // последовательность символов для поиска
char stored_numbers [][4]{ // массив char по 4-ре символа
"1234",
"5678",
"4567",
"7801",
"6390",
"7524"
// ... и так далее
};
bool find_number() {
...
return true; // совпадение есть
return false; // нет
}
int find_number_index() {
...
return ... ; // номер совпавшей ячейки массива
}Как это можно реализовать проще всего? Подскажите пожалуйста!
проще реализовать - последовательным просмотром. А эффективнее сначала отсортировать исходный массив
Для настоящего двухмерного массива - цикл с memcmp. Тут ты какую-то чушь написал.
А что она должна выдавать?
самый простой вариант: true или false, то есть найдено совпадение или нет
Ага, т.е. Вам не интересует позиция, Вам важно только найдено или нет?
Ну, тогда забудьте, что это массив и "скольки он мерный", просто ищите в той памяти, которую он занимает точно также как бы подстроку в строке искали бы.
Спасибо всем, кто помог! Наконец-то разобрался с функцией memcmp Мой вариант кода:
char input_number[] {"7328"}; // последовательность символов для поиска char stored_numbers [][4] { // массив char по 4-ре символа "1234", "5678", "4567", "7801", "6390", "7524", "7328", "2304" // ... и так далее }; int numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера bool find_number() { for (int i = 0; i < numCount; i++) { // numCount количество элементов if (memcmp(input_number, stored_numbers[i], 4) == 0) { //Serial.print("Match found!"); return true; } } //Serial.print("Not found!!!"); return false; } int find_number_index() { for (int i = 0; i < numCount; i++) { // numCount количество элементов // Serial.println(i); if (memcmp(input_number, stored_numbers[i], 4) == 0) { Serial.print("Finded! "); //Serial.println(i); return i; } } Serial.println("Not found!!!"); return 0; } void setup() { Serial.begin(115200); Serial.print("numCount = "); Serial.println(numCount); } void loop() { int result = find_number_index(); if (result)Serial.println(result); if (find_number()) Serial.println("Correct!!!"); delay(5000); }Может, кто-то знает, как написать ещё проще?
Я с memcmp не работал и не знаю верно ли с ней реализация у вас, однако ж в 37 строке у вас ошибка - нулевой элемент массива у вас совпадает с признаком - не найдено.
Ну а лично я (для себя) не стал бы "код раздувать", а сделал бы вот так:
char input_number[] {"7328"}; // последовательность символов для поиска char stored_numbers [][4] { // массив char по 4-ре символа "1234", "5678", "4567", "7801", "6390", "7524", "7328", "2304" // ... и так далее }; int numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера int find_number () { for (int i = 0; i < numCount; i++) { // numCount количество элементов if (memcmp(input_number, stored_numbers[i], 4) == 0) { return i; } } return -1; } void setup() { Serial.begin(115200); Serial.print("numCount = "); Serial.println(numCount); } void loop() { int result = find_number(); if (result != -1) { Serial.print("Found, index = "); Serial.println(result); } else { Serial.println("Not found!"); } delay(5000); }Ну и если количество элементов массива заведомо всегда меньше 127, то для экономии памяти еще вот так (не проверял и за работоспособность не могу отвечать):
char input_number[] {"7328"}; // последовательность символов для поиска char stored_numbers [][4] { // массив char по 4-ре символа "1234", "5678", "4567", "7801", "6390", "7524", "7328", "2304" // ... и так далее }; int8_t numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера int8_t find_number () { for (int8_t i = 0; i < numCount; i++) { // numCount количество элементов if (memcmp(input_number, stored_numbers[i], 4) == 0) { return i; } } return -1; } void setup() { Serial.begin(115200); Serial.print("numCount = "); Serial.println(numCount); } void loop() { int8_t result = find_number(); if (result != -1) { Serial.print("Found, index = "); Serial.println(result); } else { Serial.println("Not found!"); } delay(5000); }Да, про возможное совпадение с нулевым элементом массива я не подумал! Большое спасибо, что указали на ошибку! Теперь я понимаю, почему из функции при отсутствии совпадений нужно возвращать не 0, а -1!
А если использовать uint8_t (беззнаковый тип), тогда количество элементом может быть 256, то есть от 0 до 255?
Но тогда ты не сможешь вернуть из функции «-1», понимашшшш куды клоню?). А вообще это все от задачи зависит, то есть если у тебя заведомо больше 127 элементов массива, то никто не заставляет экономить байты на этом - используй int16_t просто и все ))).