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

Некорректно сравниваются строки символов

12.02.2020, 06:58. Показов 1103. Ответов 2
Метки нет (Все метки)

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
// Структуры (3я жизнь ).cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
 
#include <iostream>
using namespace std;
 
struct train
{
    char City_of_Destination[50];
    int Number;
    char Time_of_Departure[50];
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const int amountOfTrains = 5;
    const int amountOfTrains_struct = 6;
    train base[amountOfTrains_struct] = {};
 
    for (int i = 0; i < amountOfTrains; i++)
    {
        cout << "Пункт назначения: ";
        cin >> base[i].City_of_Destination;
        cout << "Номер: ";
        cin >> base[i].Number;
        cout << "Время отбытия: ";
        cin >> base[i].Time_of_Departure;
        cout << endl;
    }
 
    char temp[50], a, b;
 
    for (int i = 0; i < amountOfTrains - 1; i++)
    {
        for (int j = i + 1; j < amountOfTrains; j++)
        {
            if (base[i].City_of_Destination > base[j].City_of_Destination)
            {
                swap(base[i], base[j]);
 
            }
        }
    }
 
    for (int i = 0; i < amountOfTrains; i++)
    {
        cout << "Номер поезда: " << base[i].Number << "; Пункт назначения: " << base[i].City_of_Destination << "; Время отбытия: " << base[i].Time_of_Departure << "; \n";
    }
 
    char destination_point[50];
    int fail = 0;
 
    cout << "введите пункт назначения: \n";
    cin >> destination_point;
    for (int i = 0; i < amountOfTrains; i++)
    {
        if (destination_point[0] == base[i].City_of_Destination[0] && destination_point[1] == base[i].City_of_Destination[1] && destination_point[2] == base[i].City_of_Destination[2]) {
            cout << "Номер поезда: " << base[i].Number << "; Пункт назначения: " << base[i].City_of_Destination << "; Время отбытия: " << base[i].Time_of_Departure << "; \n";
        }
        else {
            fail++;
        }
    }
 
    if (fail == amountOfTrains) cout << "Нет ни одного поезда " << destination_point << ".";
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2020, 06:58
Ответы с готовыми решениями:

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

Не сравниваются строки
Сегодня мне понадобилось вызвать программу с аргументом команднйо строки я посмотрел пример на ...

Плохо сравниваются строки через strcmp
Здравствуйте. Пользователей вводит минимальное кол-во матчей, которое сравнивается с данными...

Получить из строк новую строку, содержащюю первые N1 символов строки S1 и последнии N2 символов строки S2
помогите написать программу на двух разных классах! 2) Даны целые положительные числа N1 и N2 и...

2
Модератор
2639 / 1751 / 920
Регистрация: 16.10.2013
Сообщений: 5,067
Записей в блоге: 14
12.02.2020, 07:24 2
Лучший ответ Сообщение было отмечено Axandrone как решение

Решение

Axandrone, используйте для названий город string раз на c++ пишите

Добавлено через 54 секунды
Цитата Сообщение от Axandrone Посмотреть сообщение
struct train
{
char City_of_Destination[50];
int Number;
char Time_of_Departure[50];
};
C++
1
2
3
4
5
6
struct train
{
string City_of_Destination;
int Number;
string Time_of_Departure;
};
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
12.02.2020, 10:54 3
Цитата Сообщение от Axandrone Посмотреть сообщение
if (base[i].City_of_Destination > base[j].City_of_Destination)
Т.к. у Вас City_of_Destination имеет тип char*, то это сравнение адресов, а не сравнение строк.
C++
1
if (  strcmp(base[i].City_of_Destination , base[j].City_of_Destination)>0 )
Добавлено через 2 часа 14 минут
Axandrone, обратите внимание, что при использовании string вместо char массивов у Вам могут некорректно выполняться операции копирования объектов целиком:
Цитата Сообщение от Axandrone Посмотреть сообщение
swap(base[i], base[j]);
Компилятор создает копиконструктор по умолчанию, который тупо копирует все содержимое объекта.
Однако, STL контейнеры типа string данные хранят не внутри объекта, а в динамической памяти. В результате они скопированы не будут.
Поэтому, надо либо написать свои собственные операторы копирования, либо вернуться к статическим char массивам и для сравнения использовать strcmp.
1
12.02.2020, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2020, 10:54
Помогаю со студенческими работами здесь

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

Не сравниваются строки
Подскажите, как ввод с клавиатуры сравнить с &quot;zzz&quot; и выйти из цикла не хочет сравнивать string name...

Не сравниваются строки через Contains
Допустим, что у меня есть два строковых массива. В одном массиве целое предложение. (&quot;Василий...

Не сравниваются строки массива
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; struct list {...


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

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