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

Зацикливание при сравнении строк - C++

Восстановить пароль Регистрация
 
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
14.05.2014, 21:43     Зацикливание при сравнении строк #1
Добрый вечер. У меня возникла проблема при сравнивании строк, после сравнивания происходит расчет по циклу [j] и далее по идее должно переходить к циклу по [i], но программа зацикливается на [j] здесь, вечно накапливает k и ничего толкового не считает. Почему зацикливается?
C++ (Qt)
1
2
3
4
5
6
7
8
9
if(strcmp(sell[i].FIO,sell[j].FIO)==0 && sell[j].FIO!="\0")
{
k++;
strcpy(sell[j].FIO,"\0");
st.at=st.at+sell[j].at;
st.ves=st.ves+sell[j].ves;
st.shtuk=st.shtuk+sell[j].shtuk;
st.time=st.time+sell[j].time;
}
Код всей функции
C++ (Qt)
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
void output()
{
seller st;
char filename[]="sellers.dat";
int n;
FILE *f;
clrscr();
f=fopen(filename,"rb+");
if(f)
{
fseek(f,0,SEEK_END);
n=ftell(f)/sizeof(seller);
seller* sell=new seller [n];
fseek(f,0,SEEK_SET);
 
   fread(&sell,sizeof(seller),n,f);
   printf("\n FIO | Weight Things | Time | Service Time Of One Purchase ");
for(int i=0;i<n-1;i++)
{
int k=1;
st.at=sell[i].at;
st.ves=sell[i].ves;
st.shtuk=sell[i].shtuk;
st.time=sell[i].time;
for(int j=i+1;j<n;j++)
{
if(strcmp(sell[i].FIO,sell[j].FIO)==0 && sell[j].FIO!="\0")
{
k++;
strcpy(sell[j].FIO,"\0");
st.at=st.at+sell[j].at;
st.ves=st.ves+sell[j].ves;
st.shtuk=st.shtuk+sell[j].shtuk;
st.time=st.time+sell[j].time;
}
st.at=st.at/k;
}
printf("\n %25s/%2d/%2d/%f/%5.2f",st.FIO,st.ves,st.shtuk,st.time,st.at);
}
}
printf("Press any key");
getch();
fflush(stdin);
fclose(f);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 22:06     Зацикливание при сравнении строк #2
Цитата Сообщение от -Arabella- Посмотреть сообщение
Почему зацикливается?
С первого взгляда никакого зацикливания быть не должно: i,j растут постоянно, n не меняется в цикле.
Что в исходном файле sellers.dat ?
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
15.05.2014, 06:01  [ТС]     Зацикливание при сравнении строк #3
Tulosba,
Цитата Сообщение от Tulosba Посмотреть сообщение
Что в исходном файле sellers.dat ?
Ну по идеи должны быть структуры: фамилия и 4 цифирки, но в него записывается ерунда, вот я и искала ошибку с помощью F7 в функции вывода и после if постоянно возвращается на if, намного больше раз, чем структур
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 07:45     Зацикливание при сравнении строк #4
-Arabella-, чему в 13 строке равно n?
В 16 строке нужно убрать &.
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.05.2014, 08:31     Зацикливание при сравнении строк #5
Цитата Сообщение от -Arabella- Посмотреть сообщение
if(strcmp(sell[i].FIO,sell[j].FIO)==0 && sell[j].FIO!="\0")
sell[j].FIO!="\0" - это проверка того, что адрес строки sell[j].FIO не совпадает с адресом
константной строки, не содержащей текста.
Полагаю, что Вы имели ввиду sell[j].FIO[0]!=0 или (что то же самое) strlen(sell[j].FIO)!=0
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
15.05.2014, 09:25  [ТС]     Зацикливание при сравнении строк #6
Tulosba, n вычисляется в 12, n - количество структур. А почему в 16 нужно убрать &?
zss, я хотела сделать проверку не пустая(нулевая) ли эта строка, потому что если строки совпадают и чтоб потом опять с этой строкой не сравнивать я ее делаю нулевой(пустой), мне все убрать ковычки и слэш?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 10:56     Зацикливание при сравнении строк #7
Цитата Сообщение от -Arabella- Посмотреть сообщение
А почему в 16 нужно убрать &?
Потому что fread принимает адрес начала памяти, куда будет производится чтение. И этот адрес - это sell, полученный в 13 строке. А вовсе не адрес переменной sell, который получается, если написать &sell.
Для проверки что строка не пустая можно использовать такой код:
C++
1
if( *str )
А если обезопасить себя от нулевого указателя, то такой:
C++
1
if( str && *str )
zss
Модератор
Эксперт С++
 Аватар для zss
5946 / 5551 / 1784
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
15.05.2014, 11:29     Зацикливание при сравнении строк #8
Цитата Сообщение от -Arabella- Посмотреть сообщение
мне все убрать ковычки и слэш?
Да, и сравнивать не адрес, а нулевой элемент массива:
C++
1
if(strcmp(sell[i].FIO,sell[j].FIO)==0 && sell[j].FIO[0]!=0)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2014, 00:25     Зацикливание при сравнении строк
Еще ссылки по теме:

Ошибка при сравнении типа char C++
C++ Неожиданный результат при сравнении производительности вектора и обычного массива
C++ Зацикливание при сравнении двоичных чисел

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

Или воспользуйтесь поиском по форуму:
-Arabella-
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 231
16.05.2014, 00:25  [ТС]     Зацикливание при сравнении строк #9
Tulosba, zss, Спасибо))) Заработало
Yandex
Объявления
16.05.2014, 00:25     Зацикливание при сравнении строк
Ответ Создать тему
Опции темы

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