Форум программистов, компьютерный форум CyberForum.ru

Сравнение строки в структуре с переменной типа char - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.96
ms.natali
 Аватар для ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 15:17     Сравнение строки в структуре с переменной типа char #1
Есть некая функция Х которая возвращает кол-во строк структуры Poezda a[], строка a[].StNazn в которой равна введеному с клавиатуры c и создает структуру Poezda b[] в которую записывает те строки в а[] которые совпали с "с". я наверное плхо объяснила, но всё же. проблемма в том что строка структуры и "с" не хотят стравниваться. как бы так их сравнить чтобы всёбыло ок?))
C++
1
2
3
4
5
6
7
int X(Poezda a[],Poezda b[],int n,char с)
{
    int k=0;
    for(int i=0;i<n;i++)
        if (...) b[k++]=a[i];
    return k;
}


Вот текст задания
Сравнение строки в структуре с переменной типа char
и full код который уже есть. осталось только подставить в 46 строчке вместо ... сравнение)))
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
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
struct Poezda
{
    char Nomer[5];
    char StNazn[20];
    char TimeOtpr[20];
    char TimeVputi[20];
    char NalBilet[10];
};
void output ( Poezda a[], int n)
{
    cout<<"Номер|"<<setw(9)<<"Станция Назначения|"<<setw(9)<<"Время отправления|"<<setw(15)
            <<"Время в пути|"<<setw(7) <<"Наличие билетов|"<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<"__________________________________________________________________________"<<endl;
        cout<<setw(2)<<a[i].Nomer<<"|"<<setw(19)<<a[i].StNazn<<"|"<<setw(17)<<a[i].TimeOtpr<<"|"
                   <<setw(14)<<a[i].TimeVputi<<"|"<<setw(15)<<a[i].NalBilet<<"|";
        cout<<endl;
    }
}
void sort(Poezda a[],int n)
{
    Poezda min;
    int n_min;
    for(int i=0;i<n;i++)
    {
        min=a[i];n_min=i;
        for(int j=i;j<n;j++)
            if(strcmp(a[j].TimeOtpr,min.TimeOtpr)<0)
            {
                min=a[j];
                n_min=j;
            }
            a[n_min]=a[i];
            a[i]=min;
    }
}
int X(Poezda a[],Poezda b[],int n,char c[20])
{
    int k=0;
    for(int i=0;i<n;i++)
        if (...) b[k++]=a[i];
    return k;
}
int main()
{
    setlocale (LC_CTYPE, "Russian");
    Poezda t[10]={
        "126Э","Новороссийск","00:25","30ч.","да",
        "244В","Рузаевка","10:50","10 ч. 13 мин.","нет",
        "232M","Казань","00:30","12 ч. 49 мин.","да",
        "356Й","Уфа","12:26","30 ч.","да",
        "252В","Саранск","01:20","10 ч. 18 мин.","нет",
        "030С","Новороссийск","10:20","23 ч. 26 мин.","да",
        "104М","Адлер","08.20","27 ч.","да",
        "082И","Улан-Удэ","13:10","88 ч.","да",
        "076Э","Тында","13:10","116 ч.","нет"
    };
    cout<<"input"<<endl<<endl<<endl;
    output(t,10);
    sort(t,10);
    cout<<endl<<endl<<"Out"<<endl<<endl<<endl;
    output(t,10);
    Poezda b[10];
    
    char c[20];
    cout<<endl<<"Введите станцию назначения"<<endl; cin>>c[20];
    int k=X(t,b,10,c);
    cout<<k;
        if(k!=0) output(b,k);
    system("pause");
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2012, 15:17     Сравнение строки в структуре с переменной типа char
Посмотрите здесь:

C++ Определить, сколько единиц содержится в двоичном представлении переменной типа char
C++ проблема с переменной типа char
C++ Вывод переменной типа char
C++ Сравнение массивов типа Char
Использование переменной типа char в цикле for C++
Использование знака пробел при вводе переменной типа char[] C++
Как получить адрес переменной типа unsigned char? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
6055 / 5658 / 1828
Регистрация: 18.12.2011
Сообщений: 14,450
Завершенные тесты: 1
30.03.2012, 15:38     Сравнение строки в структуре с переменной типа char #2
C++
1
if(strcmp(a[].StNazn ,c)==0)  b[k++]=a[i];
ms.natali
 Аватар для ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 15:41  [ТС]     Сравнение строки в структуре с переменной типа char #3
zss, Я так уже делала. не работает. Возвращает к=0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
30.03.2012, 15:46     Сравнение строки в структуре с переменной типа char #4
Там с кодировками какие-то проблемы

Добавлено через 1 минуту
С английскими названиями проблем нету
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int X(Poezda a[],Poezda b[],int n,char c[20])
    {
        int k=0;
        for(int i=0;i<n;i++)
                {                            
                 if (strcmp(a[i].StNazn ,c)==0)
                  {
                   b[k]=a[i];
                   k++;
                  }
                }
        return k;
    }
zss
Модератор
Эксперт С++
 Аватар для zss
6055 / 5658 / 1828
Регистрация: 18.12.2011
Сообщений: 14,450
Завершенные тесты: 1
30.03.2012, 15:46     Сравнение строки в структуре с переменной типа char #5
Цитата Сообщение от ms.natali Посмотреть сообщение
Я так уже делала.
Может быть там лишний символ перевода строки в конце.
Попробуйте заменить на
C++
1
    if(strncmp(a[].StNazn ,c,strlen(c)-1)==0)  b[k++]=a[i];
ms.natali
 Аватар для ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 16:03  [ТС]     Сравнение строки в структуре с переменной типа char #6
Нет. это тоже не работает. Возвращает 0. Меня больше волнует тот факт, что после того как программа вывела"нажмите клавишу для продолжения..." и я нажала эту клавишу вылезает окошко
Сравнение строки в структуре с переменной типа char
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
30.03.2012, 16:39     Сравнение строки в структуре с переменной типа char #7
C++
1
cin>>c[20];
этот код читает символ, в массиве мусор, который совсем не строка.
C++
1
char c[20];
очень плохо.
Лучше использовать string
ms.natali
 Аватар для ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 16:47  [ТС]     Сравнение строки в структуре с переменной типа char #8
Спасибо, но с другом уже разобрались =)
Оказывается проблемма была больше по кодировке, чем от
с[20] или условии))

Кому интересно вот работающий код
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
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
struct Poezda
{
     char Nomer[5];
     char StNazn[20];
     char TimeOtpr[20];
     char TimeVputi[20];
     char NalBilet[10];
};
void output ( Poezda a[], int n)
{
     cout<<"Номер|"<<setw(9)<<"Станция Назначения|"<<setw(9)<<"Время отправления|"<<setw(15)
            <<"Время в пути|"<<setw(7) <<"Наличие билетов|"<<endl;
     for(int i=0;i<n;i++)
     {
          cout<<"__________________________________________________________________________"<<endl;
          cout<<setw(2)<<a[i].Nomer<<"|"
              <<setw(19)<<a[i].StNazn<<"|"
              <<setw(17)<<a[i].TimeOtpr<<"|"
              <<setw(14)<<a[i].TimeVputi<<"|"
              <<setw(15)<<a[i].NalBilet<<"|";
          cout<<endl;
     }
}
void sort(Poezda a[],int n)
{
     Poezda min;
     int n_min;
     for(int i=0;i<n;i++)
     {
          min=a[i];n_min=i;
          for(int j=i;j<n;j++)
               if(strcmp(a[j].TimeOtpr,min.TimeOtpr)<0)
               {
                    min=a[j];
                    n_min=j;
               }
               a[n_min]=a[i];
            a[i]=min;
     }
}
int X(Poezda a[],Poezda b[],int n,char c[20])
{
     setlocale (LC_CTYPE, "Russian");
     int k=0;
     for(int i=0;i<n;i++)
     {
          if(strcmp(a[i].StNazn ,c)==0)  b[k++]=a[i];
     }
     return k;
}
int main()
{
    setlocale (LC_CTYPE, "Russian");
    Poezda t[10]={
        "126Э","Novorossiysk","00:25","30ч.","да",
        "244В","Yfa","10:50","10 ч. 13 мин.","нет",
        "232M","Novorossiysk","00:30","12 ч. 49 мин.","да",
        "356Й","Yfa","12:26","30 ч.","да",
        "252В","Capanck","01:20","10 ч. 18 мин.","нет",
        "030С","Novorossiysk","10:20","23 ч. 26 мин.","да",
        "104М","Yfa","08.20","27 ч.","да",
        "082И","Novorossiysk","13:10","88 ч.","да",
        "076Э","Capanck","13:10","116 ч.","нет",
        "076Э","Capanck","15:10","116 ч.","нет"
    };
    cout<<"input"<<endl<<endl<<endl;
    output(t,10);
    sort(t,10);
    cout<<endl<<endl<<"Out"<<endl<<endl<<endl;
    output(t,10);
    Poezda b[10];
    char c[20];
    cout<<endl<<"Введите станцию назначения"<<endl; cin>>c;
    int k=X(t,b,10,c);
    if(k!=0) output(b,k);
    else cout<<"!!!Нет совпадений!!!";
    cout<<endl;
    system("pause");
    }
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.03.2012, 16:52     Сравнение строки в структуре с переменной типа char #9
ms.natali, что значит строку сравнить с символом?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
30.03.2012, 16:59     Сравнение строки в структуре с переменной типа char #10
Все равно код опасный
C++
1
2
    char c[20];
    cout<<endl<<"Введите станцию назначения"<<endl; cin>>c;
Если ввести 25 символов получится тот самый stack corruption.
MadridianFox
Сообщений: n/a
30.03.2012, 17:11     Сравнение строки в структуре с переменной типа char #11
villu, правильно. Однако пока что никто не собирается вводить туда длинные строки и уж тем более пользоваться переполнением в корыстных целях))
ms.natali
 Аватар для ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
31.03.2012, 23:28  [ТС]     Сравнение строки в структуре с переменной типа char #12
Цитата Сообщение от go Посмотреть сообщение
ms.natali, что значит строку сравнить с символом?
Ну ечсть структура поезда. в ней строка станция назначения. и вот кажду эту строку надо сравнить с некой конечной станцие С. при совпадении тру, иначе фолс))

Добавлено через 56 секунд
Цитата Сообщение от villu Посмотреть сообщение
Если ввести 25 символов получится тот самый stack corruption.
А зачем вводить, если это студенческая лаба?)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 01:03     Сравнение строки в структуре с переменной типа char
Еще ссылки по теме:

C++ Сравнение переменной типа double c подстрокой из вектора
C++ Ввод строки в структуре, заданной как char *str через scanf (ПОМОЩЬ)
C++ Вывод адреса переменной типа char
Как сохранить float в переменной типа char? C++
C++ LNK2019 при объявлении переменной типа из пространства имен в структуре

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

Или воспользуйтесь поиском по форуму:
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 01:03     Сравнение строки в структуре с переменной типа char #13
Цитата Сообщение от ms.natali Посмотреть сообщение
А зачем вводить, если это студенческая лаба?)))
есть мнение, что нужно делать все максимально корректно независимо от ситуации. Учиться проще, чем переучиваться.
Yandex
Объявления
01.04.2012, 01:03     Сравнение строки в структуре с переменной типа char
Ответ Создать тему
Опции темы

Текущее время: 18:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru