Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21

Сравнение char* строк

03.03.2020, 00:16. Показов 3888. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем и каждому доброго времени суток.
У меня появилась проблема, с которой я уже длительный период времени не могу справиться: моя программа видит символ s, но не видит в строке название города. Надо чтобы оба условия выполнялись и счётчику добавлялось +1.
Подскажите, пожалуйста, как исправить код?
P.s. И, если можно, то как вывести новой таблицей те личности, чьи данные попали под условие? Понимаю, что аналогично выводу всей таблицы, но цикл тут не запустишь, так как эти личности могут быть в разных местах с разным i. Запоминать где-то i что ли...
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
#include <iostream>
#include <string.h>
#include <iomanip>
#define NS 2
#define NFIO 20
#define M 4
#define ADR 25
struct Date {
    int Day;
    int Month;
    int Year;
};
 
struct Stud {
    char FIO[NFIO]; 
    char Pol;
    char Obr;
    char Adress[ADR];
    char Stip;
    Date DataR;
    int ocenki[M];
    int KB;
};
void vvod(Stud*);
void vivod(Stud*);
void otbor(Stud*, Stud*);
 
int main() {
    setlocale(0, "");
    Stud Group[NS]; Stud Group1[NS];
    {
        vvod(Group);
        std::cout << std::endl;
        std::cout << "Введённые данные:";
        std::cout << std::endl;
        vivod(Group);
        std::cout<<"\nInogorodnih i okonchivshyh s. shkoly:\n";
        otbor(Group, Group1);
        return (0);
    }
}
 
void vvod(Stud* S) {
    int i;
    for (i = 0; i < NS; i++)
    {
        std::cout << i+1 << " студент";
        std::cout << std::endl;
        std::cout << "Введите Ф.И.О:";
        std::cout << std::endl;
        std::cin.getline(S[i].FIO, NFIO);
        std::cout << "Введите пол:";
        std::cout << std::endl;
        std::cin >> S[i].Pol;
        std::cin.get();
        std::cout << "Введите образование:";
        std::cout << std::endl;
        std::cin >> S[i].Obr;
        std::cin.get();
        std::cout << "Введите адрес:";
        std::cout << std::endl;
        std::cin.getline(S[i].Adress, ADR);
        std::cout << "Получает ли студент стипендию?";
        std::cout << std::endl;
        std::cin >> S[i].Stip;
        std::cin.get();
        std::cout << "Введите дату рождения:";
        std::cout << std::endl;
        std::cin >> S[i].DataR.Day >> S[i].DataR.Month >> S[i].DataR.Year;
        std::cout << std::endl;
        std::cout << "Введите оценки студента:";
        std::cout << std::endl;
        for (int k=0; k<M; k++)
            std::cin >> S[i].ocenki[k];
        std::cout << std::endl;
        std::cout << "Введите количество баллов:";
        std::cout << std::endl;
        std::cin >> S[i].KB;
        std::cin.get();
    }
 }
 
void vivod(Stud* S) {
        std::cout.setf(std::ios::left);
        std::cout.width(20);
        std::cout<< "F.I.O. ";
        std::cout.width(4);
        std::cout << "Pol  ";
        std::cout.width(13);
        std::cout<< "Obrazovaniye  ";
        std::cout.width(21);
        std::cout<< "Adress";
        std::cout.width(5);
        std::cout<< "Stip ";
        std::cout.width(11);
        std::cout<< "Data Rojdeniya ";
        std::cout.setf(std::ios::left);
        std::cout.width(13);
        std::cout<< "Ocenki  ";
        std::cout.width(6);
        std::cout<< "Bally  ";
        std::cout << std::endl;
        for (int i = 0; i < NS; i++){
            std::cout.setf(std::ios::left);
            std::cout.width(20);
            std::cout <<  S[i].FIO;
            std::cout.width(4);
            std::cout << S[i].Pol << ' ';
            std::cout.width(13);
            std::cout << S[i].Obr << ' ';
            std::cout.width(20);
            std::cout << S[i].Adress << ' ';
            std::cout.width(4);
            std::cout << S[i].Stip << ' ';
            std::cout.width(2);
            std::cout << S[i].DataR.Day << '.';
            std::cout.width(2);
            std::cout << S[i].DataR.Month << '.';
            std::cout.width(8);
            std::cout<< S[i].DataR.Year << ' ';
            for (int k=0; k<M; k++)
            std::cout << S[i].ocenki[k] << "; ";
            std::cout<<' ';
            std::cout<< S[i].KB << std::endl;
        }
}
 
void otbor(Stud* S, Stud* T) {
    int count=0, i, j;
    for(i=0;i<NS; i++){
    if ((S[i].Obr == 's') && (S[j].Adress != "St.Petersburg")) //здесь и проблема
        count++;
    }
    std::cout<<count;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2020, 00:16
Ответы с готовыми решениями:

Сравнение char строк
#include &lt;iostream&gt; using namespace std; int main() { float a, b; int c; char d; cout &lt;&lt; &quot;Input your first number: &quot;...

Сравнение char строк
bool qu() { //Функция вопроса char q; bool answer; clr(жел); Sleep(10); (cin &gt;&gt; q).get(); clr(); if ((q == 'д') || (q ==...

Сравнение текста из файла и сравнение с текстом в программе char - Dev C++
Доброго времени суток! Имеется код программы: ifstream test(&quot;primer.txt&quot;); char awm = &quot;kod&quot;; char buff; test &gt;&gt; buff; if...

12
0 / 0 / 0
Регистрация: 16.02.2020
Сообщений: 4
03.03.2020, 02:30
Почему неймспейсы не используешь?
0
Модератор
 Аватар для long399
2882 / 1837 / 933
Регистрация: 16.10.2013
Сообщений: 5,242
Записей в блоге: 15
03.03.2020, 05:31
Цитата Сообщение от __marginal Посмотреть сообщение
Работа со строками в C++
и где же те хваленые строки? Вы их не используете, вы используете массивы символов. Перейдите на строки, раз вы пишите на c++ и половина ваших проблем сама отпадет.

Образец:
1) было
Цитата Сообщение от __marginal Посмотреть сообщение
C++
14
15
16
17
18
19
20
21
22
23
struct Stud {
    char FIO[NFIO]; 
    char Pol;
    char Obr;
    char Adress[ADR];
    char Stip;
    Date DataR;
    int ocenki[M];
    int KB;
};
2) стало
Цитата Сообщение от __marginal Посмотреть сообщение
C++
14
15
16
17
18
19
20
21
22
23
struct Stud {
    string FIO; 
    string Pol;
    string Obr;
    string Adress;
    string Stip;
    Date DataR;
    int ocenki[M];
    int KB;
};

Цитата Сообщение от __marginal Посмотреть сообщение
C++
131
if ((S[i].Obr == 's') && (S[j].Adress != "St.Petersburg")) //здесь и проблема
здесь вы сравниваете массив символов с константной строкой, а это некорректно. Если бы поле структуры (адрес) было строковым - сравнение бы проходило без осложнений.

И таки-да, солидарен с предыдущим ответившим, объявите в начале кода пространство std и в коде уберите все std:: код сократиться.
C++
8
using namespace std;
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
03.03.2020, 08:31
Лучший ответ Сообщение было отмечено __marginal как решение

Решение

Цитата Сообщение от long399 Посмотреть сообщение
сравниваете массив символов с константной строкой
Уточняю:
Сравнивается адрес массива с адресом константного массива,
а надо посимвольное сравнение:
C++
1
if ( S[i].Obr == 's'  && strcmp( S[j].Adress , "St.Petersburg")==0 )
2
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
03.03.2020, 10:50  [ТС]
Сказали знакомые, что usingnamespace особо не приветствуется и нужно приучать себя к std::, поэтому такое загромождение и присутствует.
Получается да, ошибся, это массивы символов, прошу прощения - перепутал. Но к строкам, к сожалению, перейти не могу. Выполнить задание необходимо в массивах символов.

Добавлено через 23 минуты
Великолепная функция, первый раз такую вижу, справляется она отлично. Только есть замечание к Вашей правке: в данном месте
Цитата Сообщение от zss Посмотреть сообщение
strcmp( S[j].Adress , "St.Petersburg")==0 )
в скобках нужен i, так как цикл запущен от i, ну и !=0. Спасибо!
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
03.03.2020, 10:56
Цитата Сообщение от __marginal Посмотреть сообщение
ну и !=0
Функция strcmp возвращает ноль, если строки совпадают.
А по поводу j - это у Вас так было написано.
1
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
03.03.2020, 11:04  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
А по поводу j - это у Вас так было написано.
А, быть может от старого цикла осталось.
И, если Вас не затруднит, не могли бы Вы ответить на этот вопрос? Вывести в общем-то надо в том же формате.
Цитата Сообщение от __marginal Посмотреть сообщение
P.s. И, если можно, то как вывести новой таблицей те личности, чьи данные попали под условие? Понимаю, что аналогично выводу всей таблицы, но цикл тут не запустишь, так как эти личности могут быть в разных местах с разным i. Запоминать где-то i что ли...
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
03.03.2020, 12:40
Цитата Сообщение от __marginal Посмотреть сообщение
как вывести новой таблицей те личности, чьи данные попали под условие
В этом месте сделать так
C++
1
2
3
4
5
if ( S[i].Obr == 's'  && strcmp(S[i].Adress , "St.Petersburg")==0) 
{
     VivodS(S[i]);
     count++;
}
И добавьте такую функцию VivodS
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void VivodS(const Stud& S) {
            std::cout.setf(std::ios::left);
            std::cout.width(20);
            std::cout <<  S.FIO;
            std::cout.width(4);
            std::cout << S.Pol << ' ';
            std::cout.width(13);
            std::cout << S.Obr << ' ';
            std::cout.width(20);
            std::cout << S.Adress << ' ';
            std::cout.width(4);
            std::cout << S.Stip << ' ';
            std::cout.width(2);
            std::cout << S.DataR.Day << '.';
            std::cout.width(2);
            std::cout << S.DataR.Month << '.';
            std::cout.width(8);
            std::cout<< S.DataR.Year << ' ';
            for (int k=0; k<M; k++)
            std::cout << S.ocenki[k] << "; ";
            std::cout<<' ';
            std::cout<< S.KB << std::endl;
}
1
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
03.03.2020, 13:51  [ТС]
Записываю функцию в int main вот так
C++
1
vivodS(Group1);
и выдаёт ошибку
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
03.03.2020, 14:06
Цитата Сообщение от __marginal Посмотреть сообщение
Записываю функцию в int main
Зачем в main что-то менять?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int otbor(Stud* S, Stud* T) {
    int count=0, i, j;
    for(i=0;i<NS; i++)
    {
           if ( S[i].Obr == 's'  && strcmp(T[i].Adress , "St.Petersburg")==0) 
          {
                 VivodS(S[i]);
                 T[count]=S[i];
                 count++;
          }
    }
    std::cout<<count;
   return count;
}
Отобранные строки попадут в массив T в количестве count.
Если надо, то можете теперь в main это использовать
C++
1
2
3
int n=otbor(Group, Group1);
for(int i=0;i<n;i++)
   VivodS(Group1[i]);
0
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
03.03.2020, 14:11  [ТС]
Потому что все функции вызываются у меня в int main.
Есть функции ввода, вывода введённого, отбора, и вот теперь появляется последняя - функция вывода отобранного.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
03.03.2020, 14:23
Ну, раз хочется, чтобы только из main, то см. еще раз пост 10.
Я там исправил заполнение массива T, и показал, как в main его вывести.
Еще можете исправить заголовок функции vivod на
C++
1
void vivod(Stud* S, int NS);
Тогда ее можно будет использовать для вывода обоих массивов и VivodS не понадобится:
C++
1
2
3
4
        vivod(Group,NS);
        std::cout<<"\nInogorodnih i okonchivshyh s. shkoly:\n";
        int n=otbor(Group, Group1);
        vivod(Group1,n);
1
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
04.03.2020, 11:36  [ТС]
Поставленная задача решена, что-то новое я почерпнул с этой темы, всем большое спасибо за то, что отозвались!
(по итогу я оставил одну функцию вывода и просто менял там NS и count если что. А в функции отбора создавал новый массив T[count]=S[i])
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2020, 11:36
Помогаю со студенческими работами здесь

Сравнение разных типов *Char и Char
Друзья, выполняю задание по имитации консольной команды Windows. Встретился с проблемой разделения введенной строки на отдельные слова, но...

Сравнение char
Всем привет. Программа получающая данные по ком-порту. Данные считываются побайтово. Полученные данные надо писать в файл в определённом...

Сравнение char-ов
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Windows.h&gt; #include &lt;cctype&gt; using namespace std; int main() { ...

Сравнение двух char
Вообщем столкнулся с такой проблемой что нужно сравнить два чара между собой,причем char name; char numName; cin&gt;&gt; ...

Сравнение типа char
есть функция, которая получает значение класса, и сравнивает его с вводимым пользователем значением: void Library::find_book(){ char...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru