С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465

Поэлементный просмотр анализ строки

18.04.2017, 23:30. Показов 5378. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!

Прошу помочь со следующей проблемой. Есть строка, в которое вводится выражение с консоли. Как в С# создать указатель на данную строку, который бы мог перемещаться по её элементам в зависимости от условия?

Ну например если текущий элемент, на который указывает указатель является пробелом или кавычками, то указатель должен перейти на следующий элемент строки.

Вариант через цикл for, пробегом по всем элементам не подходит, так как проверяться условие и соответственно смещаться указатель будет последовательно в разных функциях (в разных частях программы), начиная с той позиции, на которой он был в предыдущей функции.
Следующий вариант, который я пробовал оказался не верным:
C#
1
2
3
string exp_ptr; //содержет вырожение
string* ptr= exp_ptr; //указатель на текущую позицию в строке
while (string.IsNullOrEmpty(*ptr)) ++ptr;
Прошу помочь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2017, 23:30
Ответы с готовыми решениями:

Просмотр командной строки при отладке
При отладке командная строка всегда находится свернутой, т.е чтобы увидеть что там происходит, после каждого нажатия на F11, приходится...

Просмотр предыдущей строки по номеру из текста
Здравствуйте! Подскажите у меня есть текстовый документ и там очень много строк к примеру: 2412,2,2,2,2,2,0 2413,2,2,2,2,2,0 ...

Оптимальный анализ строки
Добрых времени суток. Имеесть файл вида: Hi slot 1 Hi slot 2 Med slot 1 Med slot 2 Low slot 1 Low slot 2 Нужно...

26
11 / 9 / 24
Регистрация: 04.11.2015
Сообщений: 37
18.04.2017, 23:36
Сделай из строки массив из символов, а уже по этому массиву перемещайся как тебе угодно
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
18.04.2017, 23:42
xSanekk, строка и есть массив символов

Добавлено через 1 минуту
Vlad__i__mir, приведите пример строки и действий, которые должны выполняться
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
18.04.2017, 23:47
Зачем тут указатели и прочее?

C#
1
2
3
4
5
6
7
8
9
            string str = "aaaa\" bbbb ggffgfgf";
 
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == ' ' || str[i] == '"')
                    continue;
 
                Console.Write(str[i]);
            }
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
18.04.2017, 23:50  [ТС]
Понимаете, мне нужно анализировать именно исходную строку, а создавать производный от неё массив символов и копировать в него содержимое строки, что бы потом перебирать его это громоздко.

Поэтому возникла мысль создать указатель на строку, который бы перемещался непосредственно по её элементам, но сделать это не получается.
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
18.04.2017, 23:53
Vlad__i__mir, просто перебирайте строку как массив как уже было сказано ранее
Цитата Сообщение от Hitoku Посмотреть сообщение
строка и есть массив символов
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
18.04.2017, 23:58  [ТС]
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
class kalculiator
        {
            enum typesT { UNDEFTOK, OPERATOR, NUMBER, VAREBAL};
            enum errorsT { SERROR, PARENS, NOEXP, DIVZERO };
 
            string exp_ptr; //содержет вырожение
            string* ptr= exp_ptr; //указатель на текущую позицию в строке
            char [] token=new char[70]; //содержет текущую лексему
            typesT tok_type; //содержет тип лексемы
public void get_token()
            {
                ptr = exp_ptr;
                tok_type = UNDEFTOK; //обнуление типа для анализа следующей лексемы
                
                if (!*ptr) return; //конец выражения
 
                while (string.IsNullOrEmpty(*ptr)) ++ptr; //пропустить пробелы
 
                if (*ptr.IndexOf("+-*/%^=()")>-1)
                { //ищет нужный оператор в 1-ом аргументе и возвращает указатель на него
                    tok_type = OPERATOR;
                    *ptr++; //перейти к следующему символу
                }
                
                else if (isalpha(*ptr)){ //проверка на принадлежность к букве алфавита
                while (!isdelim (*ptr)) //проверка на разделитель
                *ptr++;
                tok_type=VARIABLE; }
                
                else if (isdigit(*ptr))
                {
                    while (!isdelim(*ptr)) *temp++ = *ptr++; //проверка на разделители
                    tok_type = NUMBER;
                }
                *temp = '\0';
                
 
            }
Код кривой - переделываю с С++. Ну как пример функция get_token(), но таких функции будет не одна.

Добавлено через 4 минуты
Цитата Сообщение от Hitoku Посмотреть сообщение
Vlad__i__mir, просто перебирайте строку как массив как уже было сказано ранее
Это работает если строку нужно проанализировать всю сразу и с начала, но как я уже писал
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
цикл for, пробегом по всем элементам не подходит, так как проверяться условие и соответственно смещаться указатель будет последовательно в разных функциях (в разных частях программы), начиная с той позиции, на которой он был в предыдущей функции.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
19.04.2017, 00:52
ну о5 25, переделываю, изобретаю, натыкаюсь, не работает...
Озвучте задачу, и,скорее всего, подскажут что, да как...
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Вариант через цикл for, пробегом по всем элементам не подходит, так как проверяться условие и соответственно смещаться указатель будет последовательно в разных функциях (в разных частях программы), начиная с той позиции, на которой он был в предыдущей функции.
это вообще к чему? значение итератора можно изменить, если надо; а может статься так, что совсем другие методы смогут вам помочь
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
19.04.2017, 00:54
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
цикл for, пробегом по всем элементам не подходит, так как проверяться условие и соответственно смещаться указатель будет последовательно в разных функциях (в разных частях программы), начиная с той позиции, на которой он был в предыдущей функции.
Так используйте переменную типа int для хранения позиции...
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.04.2017, 08:59  [ТС]
Вы скажите можно ли создать указатель на строку, что бы его потом с помощью инкремента (++ptr) перемещать?
Если да, то покажите пожалуйста как?
0
19.04.2017, 09:08

Не по теме:

Три человека объясняют, что забивать гвозди табуреткой хоть и можно, но не стоит, а ТС всё равно спрашивает какую именно табуретку нужно использовать.

0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
19.04.2017, 10:04
Может тебе класс StringReader использовать? Там и указатель , и перемещение туда-сюда и чтение уже сделаны
0
Эксперт .NET
 Аватар для Usaga
14108 / 9325 / 1349
Регистрация: 21.01.2016
Сообщений: 35,022
19.04.2017, 10:08

Не по теме:

Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Понимаете, мне нужно анализировать именно исходную строку, а создавать производный от неё массив символов и копировать в него содержимое строки, что бы потом перебирать его это громоздко.
:good:



Добавлено через 1 минуту
Vlad__i__mir, вы можете перебирать символы строки без получения указателей и создания других строк:

C#
1
2
foreach(char c in somestring) {
}
Добавлено через 53 секунды
Или подразумевалось что-то другое?..
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.04.2017, 10:14  [ТС]
Цитата Сообщение от Exerion Посмотреть сообщение
Не по теме:
Три человека объясняют, что забивать гвозди табуреткой хоть и можно, но не стоит, а ТС всё равно спрашивает какую именно табуретку нужно использовать.
Уже раза 3 привёл аргумент почему мне этот метод не подходит, привел пример кода где это видно, но мне всё равно предлагают то же самое. А на мой вопрос никто так конкретно и не ответил...

Добавлено через 4 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Vlad__i__mir, вы можете перебирать символы строки без получения указателей и создания других строк:
C#
1
2
foreach(char c in somestring) {
}
Или подразумевалось что-то другое?..
Да, но это в моём случае не сработает, потому что в данной функции я например проанализировал 1-ые два элемента строки, а потом я должен начать просмотр этой же строки в другой функции и с позиции, на которой я остановился в предыдущей функции
0
Эксперт .NET
 Аватар для Usaga
14108 / 9325 / 1349
Регистрация: 21.01.2016
Сообщений: 35,022
19.04.2017, 10:21
Добавлено через 52 секунды
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Да, но это в моём случае не сработает, потому что в данной функции я например проанализировал 1-ые два элемента строки, а потом я должен начать просмотр этой же строки в другой функции и с позиции, на которой я остановился в предыдущей функции
Стоп. Вы про IEnumerable слышали?..

Добавлено через 4 минуты
Vlad__i__mir, такой вариант вас не устроит?

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

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
using System;
using System.Collections.Generic;
using System.IO;
 
namespace NETExperiments
{
    class myClass
    {
        static void FirstFunc(IEnumerator<char> iter)
        {
            Console.WriteLine(iter.Current);
            iter.MoveNext();
            Console.WriteLine(iter.Current);
            iter.MoveNext();
        }
 
        static void SecondFunc(IEnumerator<char> iter)
        {
            Console.WriteLine(iter.Current);
            iter.MoveNext();
            Console.WriteLine(iter.Current);
            iter.MoveNext();
            Console.WriteLine(iter.Current);
            iter.MoveNext();
        }
 
        static void Main(string[] args)
        {
            IEnumerator<char> inum = "Usaga".GetEnumerator();
            inum.MoveNext();
 
            FirstFunc(inum);
            SecondFunc(inum);
 
            Console.WriteLine("done");
            Console.ReadKey();
        }
    }
}
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.04.2017, 10:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Стоп. Вы про IEnumerable слышали?..
Нет. Что это?
0
Эксперт .NET
 Аватар для Usaga
14108 / 9325 / 1349
Регистрация: 21.01.2016
Сообщений: 35,022
19.04.2017, 10:22
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Нет. Что это?
Итератор. Пример смотрите выше.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.04.2017, 10:48  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Итератор. Пример смотрите выше.
C foreach я знаком, он просматривает каждый элемент строки или массива, вы просто его как-то его по-умному назвали
Цитата Сообщение от Usaga Посмотреть сообщение
IEnumerable
поэтому я подумал, что это что-то другое.

Как я с помощью него просмотрю первый элемент строки или первые два в зависимости от условия, а потом передам ссылку уже на следующий элемент в другую функцию, которая проанализирует следующий элемент или 2-а следующих, опять же в зависимости от условия, а потом передаст ссылку уже на следующий элемент в следующею функцию и т.д.?

Т.е. каждая функция будет просматривать и анализировать не с начала, а с позиции на которой завершила просмотр предыдущая функция.
0
Эксперт .NET
 Аватар для Usaga
14108 / 9325 / 1349
Регистрация: 21.01.2016
Сообщений: 35,022
19.04.2017, 10:49
Vlad__i__mir, есть ещё класс StreamReader.

Добавлено через 43 секунды
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
C foreach я знаком, он просматривает каждый элемент строки или массива, вы просто его как-то его по-умному назвали
foreach не IEnumerable - это совсем разные вещи. Просто одно использует другое.

Добавлено через 21 секунду
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Как я с помощью него просмотрю первый элемент строки или первые два в зависимости от условия, а потом передам ссылку уже на следующий элемент в другую функцию, которая проанализирует следующий элемент или 2-а следующих, опять же в зависимости от условия, а потом передаст ссылку уже на следующий элемент в следующею функцию и т.д.?
Вы мой пример смотрели?..
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
19.04.2017, 11:02  [ТС]
Вы про него?
Цитата Сообщение от Usaga Посмотреть сообщение
C#Выделить код
1
2
foreach(char c in somestring) {
}
Да. Но как это будет работать в моем случае не пойму.
Приведу примерную схему программы, из неё видно, что ссылка на строку (ptr) передаётся из функции в функцию:
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class kalculiator
        {
            enum typesT { UNDEFTOK, OPERATOR, NUMBER, VAREBAL};
            enum errorsT { SERROR, PARENS, NOEXP, DIVZERO };
 
            string exp_ptr; //содержет вырожение
            string* ptr; //указатель на текущую позицию в строке
            char [] token=new char[70]; //содержет текущую лексему
            typesT tok_type; //содержет тип лексемы
 
           
            public kalculiator ()
            {
                exp_ptr = "";
            }
            public double eval_exp (string exp)
            {
                double result;
                exp_ptr = exp;
                get_token();
 
                if (!*ptr)
                {
                    serror(NOEXP); //выражение отсутствует
                    return 0.0;
                }
                add_sub (result);
                if (*ptr) serror(SERROR); //последняя лексема должна быть нулевой
                return result;
            }
 
 
            public void add_sub (double &rezult)
            {
                double temp;
                mul_div_pers(rezult);
                while ((op = *ptr) == '+' || op == '-')
                {
                    get_token();
                    mul_div_pers(temp);
                    switch (op)
                    {
                        case '-':
                            result = result - temp;
                            break;
                        case '+':
                            result = result + temp;
                            break;
                    }
                }
 
            }
            public void mul_div_pers (double &rezult)
            {
                double temp;
                stepen4 (rezult);
                while ((op = *ptr) == '*' || op == '/' || op == '%')
                {
                    get_token();
                    stepen4(rezult);
                    switch (op)
                    {
                        case '*':
                            result = result * temp;
                            break;
                        case '/':
                            if (!temp) serror(DIVZERO); // division by zero attempted
                            else result = result / temp;
                            break;
                        case '%':
                            result = (int)result % (int)temp;
                            break;
                    }
                }
 
            }
            public void stepen4 (double &rezult)
            {
                double temp, ex;
                unarn_oper5(rezult);
                if (*ptr == '^')
                {
                    get_token();
                    eval_exp4(temp);
                    ex = result;
                    if (temp == 0.0)
                    {
                        result = 1.0;
                        return;
                    }
                    for (t = (int)temp - 1; t > 0; --t) result = result * (double)ex;
                }
            }
            public void unarn_oper5 (double &rezult)
            {
                skobky6 (rezult);
 
                op = 0;
                if ((tok_type == OPERATOR) && *ptr == '+' || *ptr == '-')
                {
                    op = *ptr;
                    get_token();
                }
                skobky6(rezult);
                if (op == '-') result = -result;
            }
            public void skobky6 (double &rezult)
            {
                account(rezult);
 
 
            }
            public void account (double &rezult)
            {
 
            }
            public void get_token()
            {
                ptr = exp_ptr;
                tok_type = UNDEFTOK; //обнуление типа для анализа следующей лексемы
                
                if (!*ptr) return; //конец выражения
 
                while (string.IsNullOrEmpty(*ptr)) ++ptr; //пропустить пробелы
 
                if (*ptr.IndexOf("+-*/%^=()")>-1)
                { //ищет нужный оператор в 1-ом аргументе и возвращаетуказатель на него
                    tok_type = OPERATOR;
                    *ptr++; //перейти к следующему символу
                }
                
                else if (isalpha(*exp_ptr)){ //проверка на принадлежность к букве алфавита
                while (!isdelim (*exp_ptr)) //проверка на разделитель
                *temp++=*exp_ptr++;
                tok_type=VARIABLE; }
                
                else if (isdigit(*exp_ptr))
                { //проверяет на принадлежность к числу
                    while (!isdelim(*exp_ptr)) *temp++ = *exp_ptr++; //проверка на разделители
                    tok_type = NUMBER;
                }
                *temp = '\0';
                //cout << "get_token(2):  " << endl << "exp_ptr: " << exp_ptr << "token: " << token << "  " << "tok_type: " << tok_type << "temp: " << temp << endl;
 
            }
            public void serror (errorsT error)
            {
 
            }
            public bool isdelim (char c)
            {
 
            }
 
        };
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2017, 11:02
Помогаю со студенческими работами здесь

Анализ введеной на английском строки.
Люди помогите не знаю что делать,не опытный студент дали задание Анализ введеной на английском строки. Необходимая функциональность : ...

Поэлементный вывод строки
Добрый день! Подскажите, пожалуйста, как правильно действовать в такой ситуации: Используя метод вида Editor...

Поэлементный ввод из строки string
Здравствуйте, форумчане. Есть такая проблемка. Имеется файл который состоит из символов и чисел (X456.1) - это координаты. ...

Не могу разобраться с тем, как делать поэлементный перебор символов строки, изменяя значение указателя
Нужно написать такую программу, которая Даны два предложения. Напечатать те слова из первого, которые входят и во второе предложение. При...

Поэлементный ввод списка
Здравствуйте. Стоит задача сделать в Turbo Prolog чтение последовательности символов с последующим анализом(в данном случае анализ не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru