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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.96
ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
#1

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

30.03.2012, 15:17. Просмотров 3646. Ответов 12
Метки нет (Все метки)

Есть некая функция Х которая возвращает кол-во строк структуры 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");
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2012, 15:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение строки в структуре с переменной типа char (C++):

Сравнение char переменной с символом - C++
Здравствуйте, подскажите пожалуйста как сравнить char переменной с символом, так как я пытаюсь сделать не работает, условие выполняется...

LNK2019 при объявлении переменной типа из пространства имен в структуре - C++
Доброго времени суток! Возникла такая проблема , при использовании типа определенного в пространстве имен в структуре BLOCK_INFO_FILE...

Сравнение массивов типа Char - C++
У меня есть структура. Мне нужно проверит, (sportsmens.Sport==&quot;swimming&quot;); sportsmens.Sport - массив типа char

Вывод переменной типа char - C++
Переменная x типа char. x = 65; cout &lt;&lt; x; Так выводиться &quot;A&quot;. x = 64; cout &lt;&lt; x+1;

проблема с переменной типа char - C++
int count(char a){ int c=0; int words=0; while(a!='\0'){ if(a==' ')++words; } return words; } очень примитивный вопрос... ...

Использование переменной типа char в цикле for - C++
Ребята, подскажите пожалуйста, как использовать 8-ми битную переменную в цикле for? Неправильный пример - for(char i = 0; i &lt; N; i++)

12
zss
Модератор
Эксперт С++
6404 / 5970 / 1945
Регистрация: 18.12.2011
Сообщений: 15,401
Завершенные тесты: 1
30.03.2012, 15:38 #2
C++
1
if(strcmp(a[].StNazn ,c)==0)  b[k++]=a[i];
0
ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 15:41  [ТС] #3
zss, Я так уже делала. не работает. Возвращает к=0
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
30.03.2012, 15:46 #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;
    }
0
zss
Модератор
Эксперт С++
6404 / 5970 / 1945
Регистрация: 18.12.2011
Сообщений: 15,401
Завершенные тесты: 1
30.03.2012, 15:46 #5
Цитата Сообщение от ms.natali Посмотреть сообщение
Я так уже делала.
Может быть там лишний символ перевода строки в конце.
Попробуйте заменить на
C++
1
    if(strncmp(a[].StNazn ,c,strlen(c)-1)==0)  b[k++]=a[i];
0
ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 16:03  [ТС] #6
Нет. это тоже не работает. Возвращает 0. Меня больше волнует тот факт, что после того как программа вывела"нажмите клавишу для продолжения..." и я нажала эту клавишу вылезает окошко
Сравнение строки в структуре с переменной типа char
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
30.03.2012, 16:39 #7
C++
1
cin>>c[20];
этот код читает символ, в массиве мусор, который совсем не строка.
C++
1
char c[20];
очень плохо.
Лучше использовать string
0
ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
30.03.2012, 16:47  [ТС] #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");
    }
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
30.03.2012, 16:52 #9
ms.natali, что значит строку сравнить с символом?
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
30.03.2012, 16:59 #10
Все равно код опасный
C++
1
2
    char c[20];
    cout<<endl<<"Введите станцию назначения"<<endl; cin>>c;
Если ввести 25 символов получится тот самый stack corruption.
0
MadridianFox
Сообщений: n/a
30.03.2012, 17:11 #11
villu, правильно. Однако пока что никто не собирается вводить туда длинные строки и уж тем более пользоваться переполнением в корыстных целях))
ms.natali
0 / 0 / 0
Регистрация: 16.03.2012
Сообщений: 14
31.03.2012, 23:28  [ТС] #12
Цитата Сообщение от go Посмотреть сообщение
ms.natali, что значит строку сравнить с символом?
Ну ечсть структура поезда. в ней строка станция назначения. и вот кажду эту строку надо сравнить с некой конечной станцие С. при совпадении тру, иначе фолс))

Добавлено через 56 секунд
Цитата Сообщение от villu Посмотреть сообщение
Если ввести 25 символов получится тот самый stack corruption.
А зачем вводить, если это студенческая лаба?)))
0
villu
203 / 204 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 01:03 #13
Цитата Сообщение от ms.natali Посмотреть сообщение
А зачем вводить, если это студенческая лаба?)))
есть мнение, что нужно делать все максимально корректно независимо от ситуации. Учиться проще, чем переучиваться.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 01:03
Привет! Вот еще темы с ответами:

Вывод адреса переменной типа char - C++
Всем привет! Хочу задать вопрос... есть код: #include &lt;iostream&gt; int main() { char ch = 'h'; char* p = &amp;ch;

Ввод строки в структуре, заданной как char *str через scanf (ПОМОЩЬ) - C++
struct {char *str;} A; scanf(&quot;%s&quot;, &amp;A.str); Аварийное завершение программы после ввода. Если задавать вручную значение внутри...

Как сохранить float в переменной типа char? - C++
Всем здрасьте. Как можно записать float в char ? И как потом float вытащить из char, если он будет находится примерно посередине ну или...

Как получить адрес переменной типа unsigned char? - C++
Всем привет! Как получить адрес переменной типа unsigned char? Всё ерунда получается #include &lt;iostream&gt; using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
01.04.2012, 01:03
Ответ Создать тему
Опции темы

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