Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
1

Как из указателя на массив достать конкретное значение массива

04.02.2013, 20:04. Показов 1894. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Недавно написал программу проверки предложения на панграмму. Панграмма — текст, использующий все или почти все буквы алфавита. Всё получилось, но потом решил немного её передать так, чтобы если программа обнаруживала, что какой-либо буквы не хватает, записывала её в отдельный массив, а потом выводило сообщение, что данная строка не является пангаммой, т.к. в ней не хватает букв ... Но тут столкнулся с проблемой: в функцию проверки я передал указатель на массив текста, а как достать из него конкретную недостающую букву для записи её в отдельный массив, понять не могу Попытался создать указатель на массив недостающих букв и уже через него присвоить значение от основного - не вышло(
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <cstring>
#include <locale>
 
using namespace std;
 
void pangram(char *str2);
 
int main()
{
    setlocale(LC_ALL,"Russian"); //Строчка для русского языка
    char str[80];
    int choice;
    cout<<"Программа проверки предложения на панграмму"<<'\n';
    cout<<"1. Ввест свой текст"<<endl;
    cout<<"2. Использовать заданный"<<endl;
    cout<<"Введите свой вариант: ";
    cin>>choice;
    switch(choice) //Начало обработки запроса пользователя
    {
        case 1:
            cout<<endl<<"Введите текст [ENG]:"<<endl;
            fflush(stdin);  //Очищает буфер входного потока
            gets(str); //Ввод предложения с клавиатуры
            break;
        case 2:
            strcpy (str, "The quick brown fox jumps over the lazy do.");
            cout<<endl<<"Текст: "<<str<<endl;
            break;
    }
 
    pangram(str);
 
    getche();
    return 0;
}
 
void pangram(char *str2)
{
    int n=0;
    bool test=true;
    char i;
    int j;
    char nostr[20], *pno=nostr; 
    for (i='a'; i<='z'; i++) //Берём одну букву алфавита и...
    {
        for (j=0; j<=strlen(str2); j++)//...проверяем всё предложение на её наличие
        {
            if (i==str2[j]) break;
            if (j==strlen(str2)) //Если же мы перебрали всё предложение и не нашли нужной буквы, то...
            {
                pno[n]=str2[j]; //НЕВЕРНО!!! Вылетает ошибка
                n++;
                test=false;
            }
        }
    }
    if (test==true) cout<<"Это панграмма!!!"<<endl;
    else 
    {
        cout<<endl<<"Это НЕ панграмма :( Букв ";
        for(int k=0; k<=strlen(nostr); k++)
        {
            cout<<nostr[k]<<" "; //Выводим недостающие буквы
        }
        cout<<" не хватает.";
    }
}
Понимаю, что можно сделать проще, но хотелось бы именно с указателями разобраться. Просто ещё не до конца понял все тонкости их применения. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2013, 20:04
Ответы с готовыми решениями:

как достать из текстового и типизированного файла конкретное значение
Подскажите, как достать из текстового и типизированного файла конкретное значение. Т.е., есть...

Как достать из БД конкретное значение кошелька по логину юзера?
Всем привет! НЕ могу сделать так, чтобы из БД вытянуть состояние счёта по конкретному...

Присвоить конкретное значение нескольким элементам массива
Люди высшего разума, помогите Билдерщику. Можно-ли мгновенно присвоить конкретное значение...

Как при вызове функции df в терминале, вывести конкретное значение
как при вызове функции df в терминале, вывести конкретное значение, в моем случае надо вывести...

3
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
05.02.2013, 20:59 2
а почему размер nostr всего 20? если мне память не изменяет в английском алфавите 26 букв... значит нужно выделить под массив память nostr[27]...
1
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
06.02.2013, 05:29 3
если вас беспокоит этот код
C++
1
pno[n]=str2[j];
то это правильно, что беспокоит )))
во первых pno - это указатель (ну так он у вас заявлен) на структуру nostr, имеющую 20 позиций... я думаю такова была мысль при написании этого кода? это не совсем так...

порассуждаем...

операция указатель[число] - это синтаксический сахар в компиляторе, она ничто иное как *(a + i * sizeof(a)), для a=1, коим является char - и вовсе *(a+i), откуда не важно как вы запишите что pno[n], что n[pno], результат один - берётся указатель от суммы этих чисел... первое из них - это указатель, второе смещение от этого указателя в байтах... от перестановки - сумма не меняется
отлично и куда же ссылается в предельном случае цикла сей указатель? а это зависит от числа n, я уже отсюда вижу, не исполняя код - что для пустой строки n достигнет 25 точно... что несмонено больше позволеному ему в nostr[20]
выход - наверняка segmentation fault

аналогично если поглядеть на правую часть -
str2 тоже указатель, всё по аналогии... так 1[str2]=str2[1] и т.д. у вас туда пихается j равный длине строки... то вы всегда попадается за пределы строки str2, к чему? там "/0" символ и ничего интересного... а пихаете вы его в непонятные и недозволенные адреса...

дальше... если вкопаетесь в main - там есть строчка
char str[80];

str - это тоже указатель... и str[1] = 1[str] и при вызове своей функции вы лишь передаёте значения адреса str в str2
т.е. по сути ничего внутри функции не меняется... пользуйтесь str2 как обычным str... str2[2] вернёт вам str[2], т.е. третий символ строки... 2[str2] сделает тоже самое )

так же выкиньте эту фигню: *pno=nostr;
общайтесь с nostr так же по индексам...
1
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
10.02.2013, 20:05  [ТС] 4
abit, Спасибо за подробное объяснение Сам себя запутал. Мой предыдущий код был полностью неверным. Если бы я даже написал верно
C++
1
nostr[n]=str2[j];
то получалось бы что в массив nostr всегда бы записывался нулевой символ, т.к. именно на него тогда бы указывал str2[j].
Цитата Сообщение от yoghurt92 Посмотреть сообщение
а почему размер nostr всего 20? если мне память не изменяет в английском алфавите 26 букв... значит нужно выделить под массив память nostr[27]...
Спасибо, не учел этого сразу

Вот исправленный код:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <cstdio>
#include <cstring>
#include <locale>
 
using namespace std;
 
void pangram(char *str2);
 
int main()
{
    setlocale(LC_ALL,"Russian"); //Строчка для русского языка
    bool test;
    char str[80];
    int choice;
    cout<<"Программа проверки предложения на панграмму"<<'\n';
    cout<<"1. Ввест свой текст"<<endl;
    cout<<"2. Использовать заданный"<<endl;
    cout<<"Введите свой вариант: ";
    cin>>choice;
    switch(choice) //Начало обработки запроса пользователя
    {
        case 1:
            cout<<endl<<"Введите предложение [ENG]:"<<endl;
            fflush(stdin);  //Очищает буфер входного потока
            gets(str); //Ввод предложения с клавиатуры
            break;
        case 2:
            strcpy (str, "The quick brown fox jumps over the lazy dog.");
            cout<<endl<<"Текст: "<<str<<endl;
            break;
    }
 
    pangram(str);
    cout<<endl;
 
    system("pause");
    return 0;
}
 
void pangram(char *str2)
{
    bool test=true;
    int n=0;
    char i;
    int j;
    char nostr[27]; //Массив для хранения недостающих букв
    for (i='a'; i<='z'; i++) //Берём одну букву алфавита и...
    {
        for (j=0; j<=strlen(str2); j++)//...проверяем всё предложение на её наличие
        {
            if (i==str2[j]) break;
            if (j==strlen(str2)) //Если же мы перебрали всё предложение и не нашли нужной буквы, то...
            {
                nostr[n]=i; //...записываем не найденную букву в массив nostr[n]...
                test=false; //...и возвращаем логческое false
                n++;
            }
        }
    }
    if (test==true) cout<<"Это панграмма!!!"<<endl;
    else 
    {
        cout<<endl<<"Это НЕ панграмма :( Букв(ы) ";
        for(int k=0; k<=n-1; k++)
        {
            cout<<nostr[k]<<" ";
        }
        cout<<"не хватает.";
    }
}
0
10.02.2013, 20:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2013, 20:05
Помогаю со студенческими работами здесь

достать значение с массива
Подскажите, в чем ошибка? у меня есть некий перемешанный массив $myArray. в нем находятся id c...

Как одним запросом достать все значение всех полей из comments и соответствующее значение из users
В таблице comments есть поля id, author_id, post_id, text, date Я выбираю все данные из этой...

Есть одномерный массив данных, как его аппроксимировать и получить конкретное число, используя МНК
Есть одномерный массив данных, как его аппроксимировать и получить конкретное число, использую...

Передача указателя на массив и использование этого массива
Здравствуйте. в h объявляю void SaveAll(QTextEdit *textedit); в одной из функций передаю...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru