Как в массиве char найти элемент

Here is the thing. I have a character array as follows..

char[] modes = new char[] { 'm', 'q', 'h', 'y' };

Now I want to provide the user with the option to enter a character. If it exists in the modes array, I’ll do the necessary. For that I used…

//to take a character as input
mode = input.next().charAt(0);
//now to check if the array contains the character
boolean ifExists = Arrays.asList(modes).contains(mode);

But strangely ifExists returns false.

  1. Any Ideas where am I doing wrong?
  2. If this is a bad way of doing it, please suggest a way.

asked Jan 23, 2013 at 16:31

Praveen Puglia's user avatar

Praveen PugliaPraveen Puglia

5,5475 gold badges34 silver badges68 bronze badges

6

I think it’s Autoboxing – the contains() method takes an object, not a primitive.

If you use Character instead of char it will work:

    Character[] modes = new Character[] { 'm', 'q', 'h', 'y' };

    //to take a character as input
    Character mode = "q123".charAt(0);
    //now to check if the array contains the character
    boolean ifExists = Arrays.asList(modes).contains(mode);

returns true

answered Jan 23, 2013 at 16:37

NickJ's user avatar

4

The Arrays.asList() method is returning a List of char[] and not a List of char like you are expecting. I would recommend using the Arrays.binarySort() method like so:

    char[] modes = new char[] { 'm', 'q', 'h', 'y' };

    char mode = 'q';

    //now to check if the array contains the character
    int index = Arrays.binarySearch(modes, mode);
    boolean ifExists = index != -1;
    System.out.print(ifExists);

answered Jan 23, 2013 at 16:40

Pat Burke's user avatar

Pat BurkePat Burke

5804 silver badges12 bronze badges

4

I didn’t find any problem with your code and try this,

If you use this kind of Colletions then you can do lots of operations using methods available defaultly…

List<Character> l = new ArrayList<Character>();
l.add('a');
l.add('b');
l.add('c');
System.out.println(l.contains('a'));

answered Jan 23, 2013 at 16:41

sunleo's user avatar

sunleosunleo

10.4k35 gold badges114 silver badges195 bronze badges

1

You could just convert to a string and then run contains

new String(modes).contains("" + mode);

This should then return true or false for your primitive array

answered Jan 23, 2013 at 16:43

RNJ's user avatar

RNJRNJ

15.2k18 gold badges85 silver badges131 bronze badges

3

You could also use String indexOf:

boolean ifExists = new String(modes).indexOf(mode) >= 0;

or

boolean ifExists = "mqhy".indexOf(mode) >= 0;

answered Dec 3, 2018 at 12:19

Jose Tepedino's user avatar

Варя1998

0 / 0 / 0

Регистрация: 19.06.2018

Сообщений: 13

1

07.10.2018, 13:12. Показов 6687. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Не могу составить функцию поиска книги в библиотеке. Всегда выводится, “Книга не найдена!”
Массив типа char

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void bibl:: poisk(bibl a[], int&x)
{
int f = 0;
        cout << "Введите название книги: ";
        cin >> name;
        for (int i = 0; i < x; i++)
        {
            if (a[i].name==name)
            {
                cout << a[i].name << "     " << autor[i] << "     " << a[i].god << endl;
                f++;
            }
        }
        if (f == 0)
            cout << "Книга не найдена!";
        system("pause");
}

Где ошибка?



0



593 / 913 / 149

Регистрация: 10.08.2015

Сообщений: 4,771

07.10.2018, 13:27

2

Ошибка в непонимании объектной модели



0



JaponDemon

165 / 108 / 57

Регистрация: 30.08.2018

Сообщений: 357

07.10.2018, 13:31

3

Цитата
Сообщение от Варя1998
Посмотреть сообщение

a[i].name=

массив чар?

C++
1
2
3
4
5
if(strcmp(a[i].name,name) == 0)
{
          cout << a[i].name << "     " << autor[i] << "     " << a[i].god << endl;
          f++;
  }



0



Варя1998

0 / 0 / 0

Регистрация: 19.06.2018

Сообщений: 13

07.10.2018, 13:37

 [ТС]

4

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int h = 0;
        cout << "Введите автора: ";
        string author;
        getline (cin, author);
        for (int i = 0; i < x; i++)
        {
            if (strcmp(author,autor[i]) == 0)
            {
                cout << a[i].name << "     " << a[i].autor << "     " << a[i].god << endl;
                h++;
            }
        }
        if (h == 0)
            cout << "Книга не найдена";
system("pause");

А если массив строк?



0



165 / 108 / 57

Регистрация: 30.08.2018

Сообщений: 357

07.10.2018, 13:39

5

Цитата
Сообщение от Варя1998
Посмотреть сообщение

string

Цитата
Сообщение от Варя1998
Посмотреть сообщение

Массив типа char

Цитата
Сообщение от Варя1998
Посмотреть сообщение

А если массив строк?

Что ?



0



Варя1998

0 / 0 / 0

Регистрация: 19.06.2018

Сообщений: 13

07.10.2018, 13:41

 [ТС]

6

У меня есть 2 массива :

C++
1
2
string autor[5];
    char name[20];



0



JaponDemon

165 / 108 / 57

Регистрация: 30.08.2018

Сообщений: 357

07.10.2018, 13:43

7

C++
1
if (strcmp(name,autor[i].c_str()) == 0)



0



Few remarks regarding your function:

1.Why do you need the third parameter bool flag, instead of having it as local variable?

2.If you want to expand an array you should copy the old to a newly allocated and then add the new element, you can not just do: *myArray = element;

3.If you want to iterate through the array length/ size, instead of:

for (int i = 0; i < strlen(*myArray) ; ++i)

pass an additional parameter to your function, that indicates the number of elements in the array.

With std::string and std::vector you could do something like:

void check_insert (std::vector<std::string>& v, std::string& c) {

    for (auto i = 0; i < v.size(); ++i) {
        if (v[i] == c) {
            std::cout << "Found!n";
            return;
        }
    }

    v.push_back(c);
    std::cout << "Inserted!n";
}


поиск символа в массиве Char[]

От: Аноним

 
Дата:  20.10.05 11:28
Оценка:

Привет всем, подскажите пожалуста, как в массиве char найти символ например “Y”(позицию в массиве);
Спасибо


Re: поиск символа в массиве Char[]

От: Аноним

 
Дата:  20.10.05 11:31
Оценка:

И еще, подскажите пожалуйста ссылки по С++ на русскомм и легко читаемы. Если можно Страуструпа не давайте, он есть.


Re[2]: поиск символа в массиве Char[]

От:

Bell

Россия

 
Дата:  20.10.05 11:37
Оценка:

Здравствуйте, Аноним, Вы писали:
Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.

А>…Если можно Страуструпа не давайте, он есть. Нет уж, никак нельзя — щас дадим

Любите книгу — источник знаний (с) М.Горький


Re[3]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  20.10.05 11:45
Оценка:

А примерчик?


Re: поиск символа в массиве Char[]

От:

Lexey

Россия

 
Дата:  20.10.05 12:36
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Привет всем, подскажите пожалуста, как в массиве char найти символ например “Y”(позицию в массиве);

memchr или strchr, если массив нуль-терминирован.

… << RSDN@Home 1.1.4 stable rev. 510>>

“Будь достоин победы” (c) 8th Wizard’s rule.


Re[4]: поиск символа в массиве Char[]

От:

sadomovalex

Россия

http://sadomovalex.blogspot.com
Дата:  20.10.05 12:55
Оценка:

Здравствуйте, Аноним, Вы писали:

А>А примерчик?

char c[] = {'a', 'b', 'c'};
char* p = std::find(c, c + 3, 'b');

“Что не завершено, не сделано вовсе” Гаусс


Re[3]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  20.10.05 21:10
Оценка:

Здравствуйте, Bell, Вы писали:

B>Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.

Не то найдёт:

как в массиве char найти символ например “Y”(позицию в массиве);

    char foo[] = "QWERTYUIOPASDFGHJKLZXCVBNM";
    int pos = -1; // символ не найден
    for ( int i = 0; i < sizeof(foo); i++ )
        if ( foo[i] == 'Y' )
        {
            pos = i;
            break;
        }

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[4]: поиск символа в массиве Char[]

От:

Phoenickx

 
Дата:  21.10.05 13:06
Оценка:

Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Bell, Вы писали:


B>>Если имеем дело со строкой — strchr. Если с обыкновенным массивом — std::find, например.


GN>Не то найдёт

А что именно не то найдет?


Re[5]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 13:25
Оценка:

Здравствуйте, Phoenickx, Вы писали:

P>А что именно не то найдет?

strchr returns a pointer to the first occurrence of c in str, or NULL if c is not found.
А нужен индекс в массиве.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[6]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  21.10.05 13:34
Оценка:

Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Phoenickx, Вы писали:


P>>А что именно не то найдет?


GN>strchr returns a pointer to the first occurrence of c in str, or NULL if c is not found.

GN>А нужен индекс в массиве.

Вы щас человека научите на С программировать в стиле бейска. Ищется указатель, а потом вычисляется разность между найденным значением (если оно не NULL) и адресом массива. Это и будет позиция. Если надо 1-based, то прибавить потом 1.


Re[7]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 14:37
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Вы щас человека научите на С программировать в стиле бейска.

ИМХО стиль бейсика — вызывать где ни попадя библиотечные функции, смысл которых остаётся за кадром.
Я же показал как и почему работает поиск.

А>Ищется указатель, а потом вычисляется разность между найденным значением (если оно не NULL) и адресом массива. Это и будет позиция. Если надо 1-based, то прибавить потом 1.

На x86 это требует лишнюю операцию. Компиляторы это скорее всего нивелируют, но если раелизовать на асме, мой способ компактнее .

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[8]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  21.10.05 14:45
Оценка:

GN>На x86 это требует лишнюю операцию. Компиляторы это скорее всего нивелируют, но если раелизовать на асме, мой способ компактнее .

Вообще-то, здесь речь не об асме, а о С++. И на каком именно acme? В x86 есть команда scasb, которая вместе с префиксом rep вообще весь этот поиск реализует. (Правда не факт, что в пентюхах scasb будет рабтать быстрее цикла).


Re[9]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 15:17
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Вообще-то, здесь речь не об асме, а о С++.

Не я первый поднял вопрос о других языках .

А>И на каком именно acme? В x86 есть команда scasb, которая вместе с префиксом rep вообще весь этот поиск реализует.

rep scasb в этой задаче использовать не получится.

А>(Правда не факт, что в пентюхах scasb будет рабтать быстрее цикла).

Хорошее замечание, только забыли, что пеньтюхов много разных бывает .

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[10]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  21.10.05 15:19
Оценка:

GN>rep scasb в этой задаче использовать не получится.

Почему не получится ?


Re[11]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 16:10
Оценка:

Здравствуйте, <Аноним>, Вы писали:

GN>>rep scasb в этой задаче использовать не получится.


А>Почему не получится ?

Что загружать в ecx?

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[12]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  21.10.05 16:22
Оценка:

Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, <Аноним>, Вы писали:


GN>>>rep scasb в этой задаче использовать не получится.


А>>Почему не получится ?


GN>Что загружать в ecx?

да, согласен. Паскаль рулит (в смысле хранение длины строки в ее начале)


Re[13]: поиск символа в массиве Char[]

От: Аноним

 
Дата:  21.10.05 16:24
Оценка:

+1

Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, gear nuke, Вы писали:


GN>>Здравствуйте, <Аноним>, Вы писали:


GN>>>>rep scasb в этой задаче использовать не получится.


А>>>Почему не получится ?


GN>>Что загружать в ecx?


А>да, согласен. Паскаль рулит (в смысле хранение длины строки в ее начале)

Хотя может и не согласен. Изначально спрашивали про поиск в массиве, а не в строке. А размер массива очевидно известен, его в ecx и загрузим


Re[13]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 17:15
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Паскаль рулит (в смысле хранение длины строки в ее начале)

Отец Паскаля уже так не считает .

Component Pascal Language Report:

6.6 String Types

Values of a string type are sequences of characters terminated by a null character (0X). The length of a string is the number of characters it contains excluding the null character.
Strings are either constants or stored in an array of character type. There are no predeclared identifiers for string types because there is no need to use them in a declaration.
Constant strings which consist solely of characters in the range 0X..0FFX and strings stored in an array of SHORTCHAR are of type Shortstring, all others are of type String.

(стандартный CHAR двубайтный)

В общем-то логично — приходится иметь дело с API требующими 0 в конце строки. В одном проекте мне пришлось использовать fucked string, как раз по этой причине . Хотя длина хранится из других соображений — используется как в некотором роде хэш.

P.S. Строчки до сих пор остаются слабым звеном всего ПО — только что копировал 200 строк из таблицы OpenOffice в Janus — ждал 2 секунды

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth


Re[14]: поиск символа в массиве Char[]

От:

gear nuke

 
Дата:  21.10.05 17:20
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Хотя может и не согласен. Изначально спрашивали про поиск в массиве, а не в строке. А размер массива очевидно известен, его в ecx и загрузим

Ну вот видите — как легко запутать простыми строчками даже опытного человека . Так что ИМХО всё же лучше начинать изучение строчек руками, безо всяких функций, тогда и для конкретной жизненной задачи можно будет найти оптимальное решение.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Я пытаюсь написать функцию, которая ищет char * элемент в массиве char* и функция start проверяет этот элемент, если элемент существует в массиве, который я «найду», в противном случае его следует «вставить» и добавить элемент в массив.

Я написал этот код, но я не знаю, как его попробовать, программа всегда дает мне исключение, что я могу сделать, чтобы проверить элемент в моем массиве указателей?

void checkFunction(char*myArray[], char *element,bool flag)
{
for (int i = 0; i < strlen(*myArray) ; ++i)
{
if (myArray[i] == element)
{
flag = true;
}
}
*myArray = element;
flag = false;

if (flag)
{
cout << "Found" << endl;
}
else
{
cout << "Inserted" << endl;
}
}

0

Решение

C ++ Way

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, const char * argv[]) {

vector<string> myStrings { "One", "Two", "Three" };

// std::find()  finds the first element that matches a value
auto it = find(begin(myStrings), end(myStrings),  "Twooo");
if (it != end(myStrings)) {
cout << "We found this string; do something..." << endl;

}}

2

Другие решения

Несколько замечаний относительно вашей функции:

1. Зачем вам нужен третий параметр bool flagвместо того, чтобы иметь его в качестве локальной переменной?

2. Если вы хотите расширить массив, вы должны скопировать старый в недавно выделенный, а затем добавить новый элемент, вы не можете просто сделать: *myArray = element;

3. Если вы хотите выполнить итерацию по длине / размеру массива, вместо:

for (int i = 0; i < strlen(*myArray) ; ++i)

передать в вашу функцию дополнительный параметр, который указывает количество элементов в массиве.

С std::string а также std::vector Вы могли бы сделать что-то вроде:

void check_insert (std::vector<std::string>& v, std::string& c) {

for (auto i = 0; i < v.size(); ++i) {
if (v[i] == c) {
std::cout << "Found!n";
return;
}
}

v.push_back(c);
std::cout << "Inserted!n";
}

0

Добавить комментарий