С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435

Массив указателей

09.09.2009, 18:00. Показов 3284. Ответов 31

Студворк — интернет-сервис помощи студентам
Вот,продолжаю изучать тему массивы указателей. В качестве примера, почти уже на последних страницах приводится задачка с использованием указателей в 2-мерных массивах. Набрал программу, вижу что программа не выводит русские слова по запросу,решил её изменить. Вот как получилось, программу,только начинаю разбирать,что к чему, пока не до конца въезжаю в неё. Программа вроде компилируется но работает не правильно. Не скажите, где не правильно написанно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include  <windows.h>
#include <cstring>
using namespace std;
 
char b[256];
char *solution(const char *f)
{
CharToOem(f,b);
return b;
}
 
 
int main()
{
    setlocale(0,"");
    char *dictionary[][2] = {
    "карандаш","Инструмент для писания",
    "клавиатура", "устройство ввода данных",
    "винтовка","Огнестрельное оружие",
    "самолёт","Воздушное судно с неподвижным крылом",
    "сеть","Взаимосвязанная группа компьютеров",
    "", ""
    };
    char word[80];
    int i;
    cout<<"Введите слово: ";
    cin>>solution(word);
    for(i = 0; *dictionary[i][0]; i++)
    {
        if(!strcmp(dictionary[i][0],word))
        {
            cout<<dictionary[i][1]<<'\n';
            break;
        }
    }
    if(!*dictionary[i][0])
        cout<<solution(word) << " не найдено.\n";
    cin.ignore();
    cin.get();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2009, 18:00
Ответы с готовыми решениями:

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

31
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
09.09.2009, 18:19
Да вроде правильно выводит, правда я solution у себя убрал за ненадобностью. Быть может проблема как раз в кодировках сравниваемых символов? word ведь конвертируется в oem, а массив указателей нет.
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
09.09.2009, 18:28  [ТС]
Вот что выводит при вводе слова - "винтовка".
Фото ниже.
Миниатюры
Массив указателей  
0
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
09.09.2009, 18:32
Попробуй это
Code
1
cin>>solution(word);
изменить так
Code
1
cin>>word;
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
09.09.2009, 18:40  [ТС]
Не помогло, попробовал и выдало такое:
Миниатюры
Массив указателей  
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
09.09.2009, 19:02
Ну а здесь пришел великий и ужасный M128K145 и помог . Вот
ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <windows.h>
using namespace std;
 
char b[256];
char *solution(const char *f)
{
    CharToOemA(f,b);
    return b;
}
char *unsolution(const char *f)
{
    OemToCharA(f,b);
    return b;
}
int main()
{
    setlocale(LC_ALL,"Russian");
    char *dictionary[][2] = {
        "карандаш","Инструмент для писания",
        "клавиатура", "устройство ввода данных",
        "винтовка","Огнестрельное оружие",
        "самолёт","Воздушное судно с неподвижным крылом",
        "сеть","Взаимосвязанная группа компьютеров",
        "", ""
    };
    char word[80];
    int i;
    cout<<"Введите слово: ";
    cin>>word;
    for(i = 0; *dictionary[i][0]; i++)
    {
        if(!strcmp(solution(dictionary[i][0]),word))
        {
            cout<<dictionary[i][1]<<'\n';
            break;
        }
    }
    if(!*dictionary[i][0])
        cout<<"Слово " <<unsolution(word)<< " не найдено.\n";
    cin.ignore();
    cin.get();
}


ЗЫ. Люди, слушайте Gravity, он дело говорит
1
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
09.09.2009, 19:20  [ТС]
Спасибо, вот увидел что вы ещё даже и добавили функцию, только как-то она называется не CharToOem a OemToChar, это зачем эта функция, оно наверное что-то в обратном варианте переводит, или что, так как сильно похожа. Только что-то не могу понять, а зачем 2 штуки использовать?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
09.09.2009, 19:30
Golovastik, да, судя даже по названию - эти функции обратны друг другу. Но эта функция к работе програамы отношения не имеет(разве что при выводе слово которое не найдено). Так вот после этой строки
C++
1
setlocale(0,"");
все что ты вводиш в консоль - это уже не char, а OEM. И выводится тоже OEM, более того, и в файл записывается кажется тоже OEM. Собственно на твоем втором скрине тоже выведен OEM в начале второй строки. Так вот, при отсутствии совпадений, чтобы корректно вывести слово в консоль, тебе надо обратно привести его к char, что собственно OemToChar и делает
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
09.09.2009, 19:42
Если правильно все подкрутить, то работает без всяких функций конвертации.
Правда тогда программу простым кликом не запустишь
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
09.09.2009, 19:58  [ТС]
Скажите, правильно ли я расшифровал вот этот кусок своими словами как я понял.
Если что не так, напишите как правильно. Благодарю.
C++
1
2
3
4
5
6
7
8
 for(i = 0; *dictionary[i][0]; i++)
        {
                if(!strcmp(solution(dictionary[i][0]),word))
                {
                        cout<<dictionary[i][1]<<'\n';
                        break;
                }
        }
Моя расшифровка:

Производить подсчёт с нуля, до конца всех строк(которые находятся в 1-ом столбце),именно в 1-ом столбце всех строк в нём находящихся, проверять условие.
Если строка word,совпала с одной из строк, именно 1-го столбца масива dictionary, тогда вывестистроку, которая находится во 2 столбце i-ой строки, этот вывод передать парметру функции solution и выйти сразу из цикла.

Расшифровка вот этого:
C++
1
2
  if(!*dictionary[i][0])
                cout<<"Слово " <<unsolution(word)<< " не найдено.\n";
Если указатель всех строк, 1-го столбца равен нулю, тогда передать в функцию unsolution,слово word, и вывести слово word после того,как передал в функцию.
Напишите пожалуйста вашу расшифровку:
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
09.09.2009, 22:07
C++
1
2
3
4
5
6
7
8
 for(i = 0; *dictionary[i][0]; i++)
        {
                if(!strcmp(solution(dictionary[i][0]),word))
                {
                        cout<<dictionary[i][1]<<'\n';
                        break;
                }
        }
Начинаем с первой строки матрицы dictionary и идем пока не закончатся все строки.
Если
C++
1
strcmp(solution(dictionary[i][0]),word) == 0
, т.е. строки совпали, то выводим содержимое второго столбца строки матрицы в которой найдено это слово и прервать цикл за ненадобностью
C++
1
2
  if(!*dictionary[i][0])
                cout<<"Слово " <<unsolution(word)<< " не найдено.\n";
если прошли все строки и не нашли совпадений то вывести это слово на экран, предварительно преобразовав его обратно в char
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
09.09.2009, 22:17  [ТС]
Можно ли эту строку, также прописать:
C++
1
2
if(!*dictionary[i][0])
                cout<<"Слово " <<solution(word)<< " не найдено.\n";
не используя функцию unsolution?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
10.09.2009, 01:16
Можно, но тогда одни нечитаемые символы заменятся на другие. Ведь что мы делали? А мы делали следующее
Code
1
2
3
4
char word;
word: char->OEM;
...
word: OEM->char;
А сейчас ты предлагаешь сделать это
Code
1
2
3
4
char word;
word: char->OEM;
...
word: (char)OEM->OEM;
Спрашивается а какой смысл?
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
10.09.2009, 12:59  [ТС]
Просто я попробовал изменить код на такой, он вроде работает также само, без использования unsolution:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <windows.h>
using namespace std;
 
char b[256];
char *solution(const char *f)
{
        CharToOemA(f,b);
        return b;
}
 
int main()
{
        setlocale(LC_ALL,"Russian");
        char *dictionary[][2] = {
                "карандаш","Инструмент для писания",
                "клавиатура", "устройство ввода данных",
                "винтовка","Огнестрельное оружие",
                "самолёт","Воздушное судно с неподвижным крылом",
                "сеть","Взаимосвязанная группа компьютеров",
                "", ""
        };
        char word[80];
        int i;
        cout<<"Введите слово: ";
        cin>>word;
        for(i = 0; *dictionary[i][0]; i++)
        {
                if(!strcmp(solution(dictionary[i][0]),word))
                {
                        cout<<dictionary[i][1]<<'\n';
                        break;
                }
        }
        if(!*dictionary[i][0])
                cout<<"Слово " <<solution(word)<< " не найдено.\n";
        cin.ignore();
        cin.get();
}
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
10.09.2009, 13:04
Golovastik, я понимаю, но все же посмотри как выводится твое слово, если оно не найдено
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
10.09.2009, 13:11  [ТС]
Да,действительно, тоесть функция unsolution,используется чисто для условия неправильного ввода.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
10.09.2009, 13:16
да, как преобразование
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
10.09.2009, 15:02  [ТС]
Только до сих пор не могу понять почему OemToChar, ведь там также проверяется условие и CharToOeam стоит.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
10.09.2009, 15:40
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        setlocale(LC_ALL,"Russian");//после этой строки весь ввод - OEM
        char *dictionary[][2] = {
                "карандаш","Инструмент для писания",
                "клавиатура", "устройство ввода данных",
                "винтовка","Огнестрельное оружие",
                "самолёт","Воздушное судно с неподвижным крылом",
                "сеть","Взаимосвязанная группа компьютеров",
                "", ""
        }; //это все char
        char word[80]; //тоже char
        int i;
        cout<<"Введите слово: ";
        cin>>word;//уже OEM
        for(i = 0; *dictionary[i][0]; i++)
        {
                if(!strcmp(solution(dictionary[i][0]),word))//strcmp(преобразовываем к OEM,OEM)
                {
                        cout<<dictionary[i][1]<<'\n';//выводим char
                        break;
                }
        }
        if(!*dictionary[i][0])
                cout<<"Слово " <<unsolution(word)<< " не найдено.\n";//cout<<char<<преобразовываем к char<<char;
0
 Аватар для Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
10.09.2009, 16:58  [ТС]
OemToChar - функция которая переводит с русского на английский?

Почему, функция solution не хочет работать в этой строке?
C++
1
   cout<<"Слово " <<unsolution(word)<< " не найдено.\n";
Ещё раз извините за много вопросов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2009, 16:58
Помогаю со студенческими работами здесь

Массив из указателей на масив из указателей на массив из int)
Доброго времени суток! Возникла проблема - как на C++ создать массив из указателей на массив из указателей на int? То есть массив из n...

Чем отличаются двумерный символьный массив и массив указателей на строки
Двумерный символьный массив и массив указателей на строки. Собственно чем они отличаются? Заранее спасибо.

опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге)
Здравствуйте! Есть задача... вкратце. Нужно создать массив указателей по выборке животных участвующих в забеге. Это Лошадь, Крокодил,...

Массив строк как массив указателей на массивы чаров
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;; Files = NULL; int searchFile()...

Как объявить массив из 5 указателей на массив из 5 int-ов?
Здравствуйте Если, int m массив из 5 int int *m массив из 5 указателей на int int (*m) указатель на массив из 5 int То...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru