Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 3
Регистрация: 30.03.2014
Сообщений: 34
1

Scanf

04.12.2014, 11:26. Просмотров 875. Ответов 8
Метки нет (Все метки)

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
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
 
int maska(string a,string b)//проверка маски
{
    bool flag=true;
    if(a.size()==b.size())
    {
        for(int i=0;i<a.size();i++)
        {
            if(b[i]!='?')
            {
                if(a[i]!=b[i]){flag=false;break;}
            }
        }
        if(flag==true)return 1;
        else return 0;
    }
    else return 0;
}
 
int main() 
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N,K,L,*c,*itog,M,*simp;string *name,*problem,*a,*b;cin>>N>>K;
    name=new string[N];problem=new string[K];itog=new int[N];
    for(int i=0;i<N;i++){cin>>name[i];itog[i]=0;}
    for(int i=0;i<K;i++)cin>>problem[i];
    cin>>L;a=new string[L];b=new string[L];c=new int[L];
    for(int i=0;i<L;i++)
    {
        scanf("%s-%s-%i",&a[i],&b[i],&c[i]);//вот тут ругается!!
        cout<<a[i]<<'-'<<b[i]<<'-'<<c[i]<<endl;
    }
    cin>>M;simp=new int[M];
    for(int i=0;i<M;i++)cin>>simp[i];
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<K;j++)
        {
            for(int l=0;l<L;l++)
            {
                if(maska(name[i],a[l])==1)
                {
                    if(maska(problem[j],b[l])==1)itog[i]+=c[l];
                }
            }
        }
    }
    for(int i=0;i<N;i++)cout<<"NAME:"<<name[i]<<" ITOG:"<<itog[i]<<endl;
}
когда дело доходит до считывания строк
lexa-PROBA-100
???g??-?????-0
?e??-PROBA-70
?e??-PROB?-60
то он начинает выдавать ошибку. Я думаю, что он не делает различий между символом '-' и элементом string'a. Что делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2014, 11:26
Ответы с готовыми решениями:

scanf в C
можна прочитать несколько значений использав всего раз scanf например : scanf (&quot;%d %d&quot;,&amp;a,&amp;b); ?...

scanf()
Всем привет! Вот маленький тестовый пример #include &lt;stdio.h&gt; int i; int main() {...

scanf ?
господа, подскажите пожалуйста, почему после этого в VC++ вылетает исключение о нарушении доступа...

Работа со scanf()
Добрый день! Столкнулась с проблемой при работе с функцией scanf(). Особенно не получается, если...

8
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
04.12.2014, 11:33 2
а память то в std::string по волшебству сама выделиться должна, да?
0
2 / 2 / 3
Регистрация: 30.03.2014
Сообщений: 34
04.12.2014, 11:37  [ТС] 3
с этим проблем нет, но при использовании функции scanf мне необходимо распределить данные, разделённые символом '-' по массивам a,b,c соответственно, но он засчитывает символ '-' как элемент стринга, в итоге получается хаос.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
04.12.2014, 11:40 4
Цитата Сообщение от Teddy17 Посмотреть сообщение
с этим проблем нет,
с этим и проблема!ну и адреса объектов...

Не по теме:


у меня у одного складывается впечатление, что в последнее время на форуме темы преобретают характер вроде:
- смотри, вот в чем проблема
- да нет, я проверял, тут всё норм.

0
2 / 2 / 3
Регистрация: 30.03.2014
Сообщений: 34
04.12.2014, 11:43  [ТС] 5
Прости, скорей всего я ошибаюсь, но не могли бы вы указать мои недочеты в коде, или просто указать номер строки с ошибками.
0
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,170
Записей в блоге: 2
04.12.2014, 11:48 6
C++
1
2
3
a=new string[L];//Выделили память под объекты string
//где-то в scanf'e
&a[i] //  <-- берем адрес объекта a[i].
scanf будет писать в сам ОБЪЕКТ, а не в БУФЕР для символов, да и сам буфер еще по сути не создан - строка пуста!
1
2 / 2 / 3
Регистрация: 30.03.2014
Сообщений: 34
04.12.2014, 11:54  [ТС] 7
Кажется, понял - я пытался присвоить адресу строки значение, вот он и выдавал ошибку. А если считывать cin'ом каждый символ по-отдельности до символа '-', и добавлять к предыдущей строке, он не будет выдавать ошибку?
0
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
04.12.2014, 12:12 8
Teddy17, класс string хранит информацию в выделенной памяти. Т.е. адрес объекта string не равен адресу внутренней для него памяти с хранимыми символами. Не следует смешивать в одной программе библиотеки си и с++. Выберете что-то одно.
1
2 / 2 / 3
Регистрация: 30.03.2014
Сообщений: 34
05.01.2015, 16:06  [ТС] 9
Ilot, теперь, кажется, понял. Спасибо) А можно в данной ситуации как-либо обойтись без scanf, а то мой мой код работает очень долго и нудно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void razd(string *a,string *b,int *c,string buf,int n)
{
     int krug=0;c[n]=0;
     for(int i=0;i<buf.size();i++)
     {
          if(buf[i]=='-')krug++;
          else
          {
               if(krug==0)a[n].push_back(buf[i]);
               if(krug==1)b[n].push_back(buf[i]);
               if(krug==2)c[n]=c[n]*10+buf[i]-48;
          }
     }
}
Добавлено через 4 минуты
Croessmah, спасибо, теперь понял. А как можно обойтись без scanf, а то перебором занимает слишком много времени
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
#include <iostream>
#include <string>
 
using namespace std;
 
void razd(string *a,string *b,int *c,string buf,int n)
{
     int krug=0;c[n]=0;
     for(int i=0;i<buf.size();i++)
     {
          if(buf[i]=='-')krug++;
          else
          {
               if(krug==0)a[n].push_back(buf[i]);
               if(krug==1)b[n].push_back(buf[i]);
               if(krug==2)c[n]=c[n]*10+buf[i]-48;
          }
     }
}
 
int maska(string a,string b)
{
     bool flag=true;
     if(a.size()==b.size())
     {
          for(int i=0;i<b.size();i++)
          {
               if(b[i]!='?')
               {
                    if(a[i]!=b[i])
                    {flag=false;break;}
               }
          }
          if(flag==true)return 1;
          else return 0;
     }
     else return 0;
}
 
void recurs(string name,string *problem,int b,int c,string *aname,string *bprob,int *cznach,int *mas1,int *mas2,int *itog,int l,int &max,int krug)
{
    krug++;
    if(krug<=b)
    {
        for(int i=0;i<c;i++)
        {
            if((maska(name,aname[i])!=0)&&(mas1[i]!=0))
            {
                mas1[i]=0;
                for(int j=0;j<b;j++)
                {
                    if((maska(problem[j],bprob[i])!=0)&&(mas2[j]!=0))
                    {
                        mas2[j]=0;itog[l]+=cznach[i];
                        recurs(name,problem,b,c,aname,bprob,cznach,mas1,mas2,itog,l,max,krug);
                        itog[l]-=cznach[i];mas2[j]=1;
                    }
                }
                mas1[i]=1;
            }
            else
            {
                if(itog[l]>max)max=itog[l];
            } 
        }
    }
    else
    {
        if(itog[l]>max)max=itog[l];
    } 
}
 
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int a,b,c,d,*mas1,*mas2,*itog;string *name,*problem,buf;
    cin>>a>>b;
    name=new string[a];
    problem=new string[b];
    mas2=new int[b];
    for(int i=0;i<a;i++)cin>>name[i];
    for(int i=0;i<b;i++){cin>>problem[i];mas2[i]=1;}
    cin>>c;
    string *aname,*bprob;int *cznach;
    aname=new string[c];
    bprob=new string[c];
    cznach=new int[c];
    mas1=new int[c];
    for(int i=0;i<c;i++)
    {
        mas1[i]=1;cin>>buf;razd(aname,bprob,cznach,buf,i);
    }
    cin>>d;int bufint;
    itog=new int[d];
    int supermax=0;
    for(int i=0;i<d;i++)
    {
        itog[i]=0;cin>>bufint;int max=0;
        recurs(name[bufint-1],problem,b,c,aname,bprob,cznach,mas1,mas2,itog,i,max,0);
        //cout<<name[bufint-1]<<' '<<max<<endl;
        if(max>supermax)supermax=max;
    }
    cout<<supermax;
    //оптимизировать razd и recurs
}
интересует именно блок razd
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2015, 16:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка в SCANF
warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To...

scanf, char
Есть нубский вопрос... char * str=new char; //char str; scanf(&quot;%s&quot;,str); char chr;...

Scanf в Eclipse
Всем привет) Подскажите пожалуйста как мне в Eclipse ввести какие-то данные в scanf() Заранее...

Scanf зацикливание
Почему зацикливается при вводе символа? int a; while (scanf_s(&quot;%d&quot;, &amp;a) != EOF) { ... }


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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