Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26

Использование указателя для обработки строки

25.12.2015, 12:16. Показов 1002. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Объясните пожалуйста, почему цикл while обрабатывает строку char *B только с указателем?
И можно объяснить строку B=q?
Программа для поиска цифр в строке
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
#include <vcl.h>
#include <iostream.h>
#include <windows.h>
#include <string.h>
 
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    char *B;
    char q[9001];
    cout<<"Введите строку:"<<endl;
    cin.getline(q,9001,'\.');
    B = q;
    while (*B)
    {
        if (*B >= '0' && *B <= '9')
        {
            cout<<*B;
        }
    B++;
    }
    cout<<endl;
    system("pause");
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2015, 12:16
Ответы с готовыми решениями:

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

Строки и использование библиотечных функций для их обработки
Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова. Как это сделать? #include...

Использование указателя для вызова по ссылке
Всем привет! Вопрос: В чем разница? int t = 10; int q = 5; swap(&amp;t, &amp;q);//&lt;&lt; здесь system(&quot;Pause&quot;); return 0; ...

14
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
25.12.2015, 12:35
показать на 1й символ строки
C++
1
B = &q[0];
оно же
C++
1
B = q;
а потом идти к следующему символу:
C++
1
B++
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
26.12.2015, 18:18  [ТС]
получается, это аналог массива?
*B - в данном случае символ, а B - его номер в строке?
while(*B) - пока имеется строка символов *B?
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
#include <windows.h>
#include <string.h>
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main()
{
   SetConsoleCP (1251);
   SetConsoleOutputCP (1251);
   char q[2001];
   char *B;
   cout<<"Введите текст: "<<endl;
   cin.getline(q,2001,'\n');
   B=q;
   strrev(B);
   while (*B)
   {
       if(*B!=' ')
       {
           cout<<*B;
       }
       B++;
   }
   cout<<endl;
   system("pause");
}
ещё одно: это программа для вывода строки задом наперёд без пробелов. В данном случае команда strrev меняет порядок номеров символов?
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
26.12.2015, 18:46
Цитата Сообщение от qazar Посмотреть сообщение
получается, это аналог массива?
*B - в данном случае символ, а B - его номер в строке?
while(*B) - пока имеется строка символов *B?
Массивы и указатели тесно взаимосвязаны, однако это не одно и тоже. *B - это значение по адресу B, следовательно B - это адрес элемента. while(*B) = пока значение по адресу B не равно нулю.

Добавлено через 11 минут
Цитата Сообщение от qazar Посмотреть сообщение
ещё одно: это программа для вывода строки задом наперёд без пробелов. В данном случае команда strrev меняет порядок номеров символов?
По поводу программы: объявляется и заполняется символьный массив, после чего объявляется указатель, который указывает на начало массива, т.е. на его нулевой элемент, после этого функцией strrev() массив переворачивается, но указатель всё ещё указывает на ячейку с адресом нулевого элемента массива. Далее идет условие: если элемент массива равен пробелу, то не выводить его на экран, в другом случае - вывести элемент. После чего происходит инкремент B, и данный указатель начинает указывать на q[1] вместо q[0]. Последний элемент символьного массива равен нулю-терминатору, там и заканчивается цикл. Надеюсь, я помог вам.
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
26.12.2015, 20:09  [ТС]
Большое спасибо! очень помогли)) вот теперь смогу защитить эту лабораторку по программированию)

Добавлено через 1 час 9 минут
чуть не забыл: можно для первой программы (поиск цифр в строке) добавить условие: если цифр строке нет, то вывод: цифр в строке нет.
Пробовал так:
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
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    char *B;
    char q[9001];
    cout<<"Введите строку:"<<endl;
    cin.getline(q,9001,'\.');
    B = q;
    while (*B)
    {
        if (*B >= '0' && *B <= '9')
        {
            cout<<*B;
        }
        B++;
    }
    if(*B=0)
    {
        cout"Цифр в строке нет"<<endl;
    }
    cout<<endl;
    system("pause");
}
после цикла условие не работает, но если в цикле добавить с else до инкремента, то надпись выводит столько раз, сколько символов в строке.

cout<<"цифр нет"; исправил
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
26.12.2015, 23:59
Цитата Сообщение от qazar Посмотреть сообщение
if(*B=0)
Это присваивание, а не сравнение на равенство (==). Да и не нужно здесь это. До while() задай bool-флаг, присвой ему значение false. В цикле, в теле if(), где выводятся цифры, присвой ему true. После цикла проверь значение флага(if (!false)), если false, то цифр в строке нет.
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
27.12.2015, 12:02  [ТС]
Благодарю. Ещё один недочёт не могу исправить: перед выводом цифр необходим cout<<новая строка цифр. Но вывод цифр цикличен, и необходимая строка тоже выводится столько раз, сколько цифр. Нельзя ли как нить с помощью continue один раз это действие выполнить в цикле, а все следующие разы обходить его? Причём, необходимая строка должна появляться в случае наличия цифр.
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
27.12.2015, 12:15
qazar,
Я так понял, что вам нужно вывести на экран строку "Новая строка цифр" сразу же после очередного пробела. Добавьте условие:
C++
1
if (*(B+1) )
в первый if сразу же после цикла. Если что-то не так, то изъясняйтесь более понятно.
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
27.12.2015, 12:30  [ТС]
Melvil, добавить в этот код.
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
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    char *B;
    char q[9001];
    cout<<"Введите строку:"<<endl;
    cin.getline(q,9001,'\.');
    bool flag = false;
    B = q;
    while (*B)
    {
        if (*B >= '0' && *B <= '9')
        {
            flag = true;
            cout<<*B;
        }
        B++;
    }
    if (flag!=true)
    {
        cout"Цифр в строке нет"<<endl;
    }
    cout<<endl;
    system("pause");
}
тут цифры в строке ищет. И надо добавить cout<<"Новая строка цифр", но чтоб она появлялась, если цифры эти есть. Но вставляется этот вывод только в цикл, и после первого нахождения цифры необходимо прервать последующие выводы этого couta. Вообщем, чтоб для всех цифр была только один cout "новая строка цифр"
0
 Аватар для Melvil
58 / 55 / 28
Регистрация: 20.05.2015
Сообщений: 256
27.12.2015, 12:44
qazar,

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>
using namespace std;
 
int main()
{
    setlocale(0, "");
    char *B;
    char q[9001];
    cout << "Введите строку:" << endl;
    cin.getline(q, 9001, '\.');
    bool flag = false;
    bool str = false;
    B = q;
    while (*B)
    {
        if (*B >= '0' && *B <= '9')
        {
            if(str == false)
            cout << "Новая строка цифр" << endl;
            str = true;
        }
        if (*B <= '0' || *B >= '9')
        {
            str = false;
        }
        if (*B >= '0' && *B <= '9')
        {
            flag = true;
            cout << *B;
        }
        B++;
    }
    if (flag != true)
    {
        cout << "Цифр в строке нет" << endl;
    }
    cout << endl;
    system("pause");
}
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
27.12.2015, 19:13
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
int main(int argc, char* argv[])
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    
    char *B;
    char q[9001];
    cout<<"Введите строку:"<<endl;
    cin.getline(q, 9001);
    bool flag = false;
    bool output = true;
    B = q;
    while (*B)
    {
        if (*B >= '0' && *B <= '9')
        {
            flag = true;
            if (output)
            {
                cout << "Новая строка цифр: ";
                output = false;
            }
            cout<<*B;
        }
        B++;
    }
    if (flag!=true)
    {
        cout << "Цифр в строке нет!" << endl;
    }
    cout<<endl;
    system("pause");
}
Добавлено через 1 минуту
qazar, это у тебя что, и для чего?
Цитата Сообщение от qazar Посмотреть сообщение
'\.'
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
28.12.2015, 06:42  [ТС]
Цитата Сообщение от nord_v Посмотреть сообщение
qazar, это у тебя что, и для чего?
там задание: дана строка символов до точки. Определить, входят ли в неё цифры. Сфромировать из них новую строку. Чтоб только до точки проверялась строка
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
28.12.2015, 06:53
Цитата Сообщение от qazar Посмотреть сообщение
Чтоб только до точки проверялась строка
Точка это '.'. Обратный слеш там зачем?
0
 Аватар для qazar
1 / 1 / 0
Регистрация: 25.12.2015
Сообщений: 26
28.12.2015, 07:31  [ТС]
за помощь сердечно благодарю

Добавлено через 1 минуту
Цитата Сообщение от nord_v Посмотреть сообщение
Точка это '.'. Обратный слеш там зачем?
аа, нам вроде так объясняли, типа со слешем... а так он не нужен?
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
28.12.2015, 18:37
Цитата Сообщение от qazar Посмотреть сообщение
а так он не нужен?
С точкой не нужен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.12.2015, 18:37
Помогаю со студенческими работами здесь

Использование внешней программы для обработки строки
Требуется с запустить внешнюю программу, передав в нее строку из файла и получив обратно результат обработки в виде строки записать в...

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

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

Использование процедур для обработки массивов.
Проверьте пожалуйста Ввод исходных и вывод результирующих матриц производить с помощью соответствующих процедур или функций. Задания...

Использование процедур для обработки массивов
Помогите пожалуйста, не могу понять никак. Нужно сделать процедуру подсчета значений &gt; k в одномерном массиве. использовать для столбцов...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru