Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка!!! Проверка на пренадлежность символов... HELP! / 19 сообщений из 19, страница 1 из 1
11.08.2005, 12:47
    #33210199
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Народ! у меня проблема.. но она разрешимая.. просто по невнимательности, наверно, ... просто из-за проверки одной - полно ошибок вылазит. (проверка на символы перед и после искомого слова)
Суть проги - в считывании строк из файла.. потом, нужно ввести слово с клавы и проверить, есть ли совпадения.. если есть, то вывести эту строку на экран. вот прототип файла, в формате txt.. его содержимое:
Охотин Андрей Петрович 647669 1986
Кармозов Андрей Андреевич 627172 1986
Жук Алексей Сергеевич 357586 1986

--- здесь 30 символов - под имя, 6 под номер телефона и 4 под дату р.
а вот код проги:

#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "ctype.h"
#include "new.h"
#include "windows.h"
#include "math.h"
#include "iomanip.h"
#include "fstream.h"
#include "iomanip.h"
#include "stdlib.h"

/*************************/
char bufRus[256];
char* Rus(const char *text)
{
CharToOem(text,bufRus);
return bufRus;
}
/*------------------------*/
const int l_fio = 30;
struct NOTE
{
public:
char FIO[l_fio+1]; // Здесь храним Ф.И.О.
int Phone;; // Здесь храним номер телефона
int B_Day; // Здесь храним год рожления
};
/*------------------------*/
int Sorting(const void *num1, const void *num2);

int main()
{
NOTE Note[5];
FILE *file;
file = fopen("F:\\phone.txt","r");
if(!file)
{
printf("%s\n",Rus("Ошибка открытия файла."));
getch();
return 1;
}
int i=0;
while(!feof(file))
{
fgets(Note .FIO,l_fio,file);
fscanf(file,"%i%i\n",&Note.Phone,&Note.B_Day);
i++;
if(i>5)
{
printf("%s\n",Rus("Слишком много записей"));
return 2;
}
}
int n_record = i;

char name[l_fio+1];
while(true)
{
printf("%s\n",Rus("Введите фамилию для поиска:"));
printf("%s\n",Rus("Или нажмите <Enter> для выхода."));
gets(name);
if(strlen(name) == 0)
break;
OemToChar(name,name);

bool not_found = true;
for(int i=0;i<n_record;i++)
{
char *p = Note.FIO;
if(p = strstr(Note.FIO,name))
{
char *c = p;
if(c != Note.FIO) //Слово не в начале строки?
if(!ispunct(*(c-1))&&!isspace(*(c-1))) //Символ перед словом не разделитель?
continue;
if(ispunct(*p) || isspace(*p) || (*p == '\0'))
{
CharToOem(Note.FIO,Note.FIO);
printf("%30s %6i %4i\n",Note.FIO,Note.Phone,Note.B_Day);
not_found = false;
}
}
}
if(not_found)
printf("%s\n",Rus("Таких в списке нет!"));
}
printf("\n%s",Rus("Работа программы завершена!"));
getch();
return 0;
}



проверьте, плизз.. Очень интересно, в чем же ошибка..
...
Рейтинг: 0 / 0
11.08.2005, 13:06
    #33210267
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Проглядел бегло, бросается в глаза следующие выражения
Andrey_Ohotin
char *p = Note.FIO;
if(p = strstr(Note.FIO,name))


У вас проблемы с пониманием указателей и строк...
В данном случае вы сравниваете не строки,а адреса...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
11.08.2005, 13:13
    #33210291
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
для копирования использый strdup
а для сравнения strcmp
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
11.08.2005, 13:35
    #33210358
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
synapseПроглядел бегло, бросается в глаза следующие выражения
Andrey_Ohotin
char *p = Note.FIO;
if(p = strstr(Note.FIO,name))


Там все нормально. Первое - декларация указателя на char + присваивание адреса массива FIo структуры Note, нафиг ненужное, но вполне допустимое и безопастное.

Второе равносильно следующему:
Код: plaintext
1.
2.
3.
4.
p=strstr(...) //поиск подстроки
if (p!=NULL) { //если найдена
 ...
}


2 автор вопроса
Вы б хоть кнопочкой src попользовались чтоль - лично мне разбираться в таком неряшлевом оформлении просто лень, думаю большинству других тоже.
...
Рейтинг: 0 / 0
11.08.2005, 13:48
    #33210413
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
v6y synapseПроглядел бегло, бросается в глаза следующие выражения
Andrey_Ohotin
char *p = Note.FIO;
if(p = strstr(Note.FIO,name))


Там все нормально. Первое - декларация указателя на char + присваивание адреса массива FIo структуры Note, нафиг ненужное, но вполне допустимое и безопастное.

Второе равносильно следующему:
Код: plaintext
1.
2.
3.
4.
p=strstr(...) //поиск подстроки
if (p!=NULL) { //если найдена
 ...
}


2 автор вопроса
Вы б хоть кнопочкой src попользовались чтоль - лично мне разбираться в таком неряшлевом оформлении просто лень, думаю большинству других тоже.

Действительно прогнал, не разглядел что в if одно '='...
...
Рейтинг: 0 / 0
11.08.2005, 13:55
    #33210442
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
synapse

Щас глянул еще раз - у него Note объявляется как массив, а он к нему как к обычной переменной обращается:

NOTE Note[5];
...
fgets(Note.FIO) - правильно например Note .FIO или Note->FIO
...
Рейтинг: 0 / 0
11.08.2005, 13:57
    #33210448
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
v6y synapse

Щас глянул еще раз - у него Note объявляется как массив, а он к нему как к обычной переменной обращается:

NOTE Note[5];
...
fgets(Note.FIO) - правильно например Note .FIO или Note->FIO
Опаньки
Код: plaintext
 [i] 
- как курсив воспринимается . Так что фиг знает что там на самом деле
...
Рейтинг: 0 / 0
11.08.2005, 15:01
    #33210651
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
вот более понятная запись проги... так и не пойму.. в чем ошибка-то...

Код: plaintext
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.
#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "ctype.h"
#include "new.h"
#include "windows.h"
#include "math.h"
#include "iomanip.h"
#include "fstream.h"
#include "iomanip.h"
#include "stdlib.h"

/*************************/
char bufRus[ 256 ];
char* Rus(const char *text)
{
	CharToOem(text,bufRus);
	return bufRus;
}
/*------------------------*/
const int l_fio =  30 ;
struct NOTE
{
public:
	char FIO[l_fio+ 1 ];  // Здесь храним Ф.И.О.
	int Phone;;        // Здесь храним номер телефона
	int B_Day;      // Здесь храним год рожления	        
};
/*------------------------*/
int Sorting(const void *num1, const void *num2);

int main()
{
	NOTE Note[ 5 ];	
	FILE *file;
	file = fopen("F:\\phone.txt","r");
	if(!file)
	{
		printf("%s\n",Rus("Ошибка открытия файла."));
		getch();
		return  1 ;
	}
	int i= 0 ;
	while(!feof(file))
	{		
		fgets(Note[i].FIO,l_fio,file);
		fscanf(file,"%i%i\n",&Note[i].Phone,&Note[i].B_Day);
		i++;
		if(i> 5 )
		{
			printf("%s\n",Rus("Слишком много записей"));
			return  2 ;
		}
	}
	fclose(file);
	int n_record = i;
	
	char name[l_fio+ 1 ];
	while(true)
	{
		printf("%s\n",Rus("Введите фамилию для поиска:"));
		printf("%s\n",Rus("Или нажмите <Enter> для выхода."));
        gets(name);			
		if(strlen(name) ==  0 )
			break;
		OemToChar(name,name);

        bool not_found = true;
		for(int i= 0 ;i<n_record;i++)
		{
			char *p = Note[i].FIO;			
			if(p = strstr(p,name))
			{
				char *c = p;				
				if(c != Note[i].FIO) //Слово не в начале строки?
					if(!ispunct(*(c- 1 ))&&!isspace(*(c- 1 ))) //Символ перед словом не разделитель?
						continue;
				if(ispunct(*p) || isspace(*p) || (*p == '\0'))
				{					
					CharToOem(Note[i].FIO,Note[i].FIO);
					printf("%30s %6i %4i\n",Note[i].FIO,Note[i].Phone,Note[i].B_Day);
					not_found = false;
				}
			}
		}
	if(not_found)
		printf("%s\n",Rus("Таких в списке нет!"));
	}
	printf("\n%s",Rus("Работа программы завершена!"));
	getch();
	return  0 ;
}
...
Рейтинг: 0 / 0
11.08.2005, 15:18
    #33210721
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Andrey_Ohotinвот более понятная запись проги... так и не пойму.. в чем ошибка-то...

А что за ошибка? Что при компиляции выдается? Формально вроде все верно.
...
Рейтинг: 0 / 0
11.08.2005, 15:35
    #33210777
Andrey_Ohotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
v6y Andrey_Ohotinвот более понятная запись проги... так и не пойму.. в чем ошибка-то...

А что за ошибка? Что при компиляции выдается? Формально вроде все верно.

я сам не знаю! просто выскакивает окно.. что-то серьезное кажется.. но не просто ошибка компиляции.. что-то другое.. окошко выскакивает.. и именно из-за того момента, где я проверку на ссимволы делаю..
...
Рейтинг: 0 / 0
11.08.2005, 15:45
    #33210814
synapse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Господин Andrey_Ohotin вы слышали про отладку?
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
11.08.2005, 15:46
    #33210818
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
rey_Ohotinя сам не знаю! просто выскакивает окно.. что-то серьезное кажется.. но не просто ошибка компиляции.. что-то другое.. окошко выскакивает.. и именно из-за того момента, где я проверку на ссимволы делаю..
Что за окно? Че в нем написано то? Запустите прогу в отладчике и проследите, где вылетает сообщение.
...
Рейтинг: 0 / 0
11.08.2005, 18:41
    #33211428
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
А так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	int i= 0 ;
	while(fgets(Note[i].FIO,l_fio,file))
	{		
		fscanf(file,"%i%i\n",&Note[i].Phone,&Note[i].B_Day);
		i++;
		if(i> 4 ) // не 5, а 4 поскольку у тебя всего 5 элементов, а последний индекс 4
		{
			printf("%s\n",Rus("Слишком много записей"));
			return  2 ;
		}
	}
...
Рейтинг: 0 / 0
11.08.2005, 18:46
    #33211443
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
В догон:

Проблема была в том, что ты не проверял, что возвращает fgets, а зря, поскольку при чтении последней строки файла eof еще не взведен - мы не перевели каретку. Именно вызов fgets при i = 3 возвел признак конца файла, а ты это и прозявил. В памяти для 4 элемента (i==3) у тебя остался стековый мусор, этот мусор и привел к ошибке.
...
Рейтинг: 0 / 0
11.08.2005, 18:52
    #33211456
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Andrey_Ohotin
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
const int l_fio =  30 ;
struct NOTE
{
public:
	char FIO[l_fio+ 1 ];  // Здесь храним Ф.И.О.
	int Phone;;        // Здесь храним номер телефона
	int B_Day;      // Здесь храним год рожления	        
};

Вот это первая фигня. Должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
#define l_fio  30 
struct NOTE
{
	char FIO[l_fio+ 1 ];  // Здесь храним Ф.И.О.
	int Phone;;        // Здесь храним номер телефона
	int B_Day;      // Здесь храним год рожления	        
};



Andrey_Ohotin
Код: plaintext
	NOTE Note[ 5 ];

Вот это вторая фигня. Должно быть:
Код: plaintext
	struct NOTE Note[ 5 ];

Andrey_Ohotin
Код: plaintext
1.
2.
		fgets(Note[i].FIO,l_fio,file);
		fscanf(file,"%i%i\n",&Note[i].Phone,&Note[i].B_Day);

А вот это третья и самая страшная фигня. Надо читать строку в буфер, а потом ее расшифровывать для хранения. Что то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	fgets(buffer, sizeof(buffer),file);
	k=strlen(buffer);

	while(buffer[k]<'0') k--;
	buffer[k] =  0 ;
	while(buffer[k]>='0') k--;
	Note[i].B_Day = atoi(buffer+k);

	while(buffer[k]<'0') k--;
	buffer[k] =  0 ;
	while(buffer[k]>='0') k--;
	Note[i].Phone = atoi(buffer+k);

	while(buffer[k]<=' ') k--;
	buffer[k] =  0 ;
	strcpy(Note[i].FIO, buffer);
...
Рейтинг: 0 / 0
11.08.2005, 19:03
    #33211474
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
White Owl

Если код C++(а код C++, не смотря на то что используется libc, поскольку у автора компилировался исходный код ), то указанные п.1 и п.2 не являются означенными "фигнями". А по поводу п.3, то у автора наверняка файлы с фиксированной шириной столбцов (иначе, откуда взятся такой логике чтения из файла):

Код: plaintext
1.
2.
3.
4.
5.
                1              2               3
0123456789012345678901234567890123456789
Охотин Андрей Петрович              647669 1986
Кармозов Андрей Андреевич         627172 1986
Жук Алексей Сергеевич               357586 1986

"Щательнее надо" (c) МЖ
...
Рейтинг: 0 / 0
11.08.2005, 19:29
    #33211513
SeraTJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Ну, зажаривает Андрей Петрович! Супер!!!
Мы еще от "Массив! маленькая, интересная задачка.."-и не отошли, а он нам еще наготовил! А тут еще White Owl со своими придирками невтемными - 1ая фигня, вторая...

Эх, если б мы, как Охотин Андрей, ничего не знали об отладчике и глазами бы ошибки искали...
...
Рейтинг: 0 / 0
11.08.2005, 23:53
    #33211769
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
Анатолий ШироковЕсли код C++(а код C++, не смотря на то что используется libc, поскольку у автора компилировался исходный код ), то указанные п.1 и п.2 не являются означенными "фигнями".
Если бы человек писал на C++ его код выглядел бы совершенно по другому. Тот факт что его код все же компилируется означает только то, что он использует C++ режим работы компилятора, для текста на С. Сколько глюков может вылезти только из этого, я рассказывать не буду.

Анатолий ШироковА по поводу п.3, то у автора наверняка файлы с фиксированной шириной столбцов (иначе, откуда взятся такой логике чтения из файла):
Откуда взялась такая логика чтения файла очень просто - не умеет человек работать со строками в С. Посмотрит на предложеный мной код - найдет много интересного... может быть :)
Но на работу с фиксированой шириной столбцов исходник не походит никак. Ну никак он не будет работать хоть фиксированая там ширина хоть переменная.

"Щательнее надо" (c) МЖ

для SeraTJ: я не пользовался отладчиком :)
...
Рейтинг: 0 / 0
12.08.2005, 01:44
    #33211831
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка!!! Проверка на пренадлежность символов... HELP!
2 White Owl

авторЕсли бы человек писал на C++ его код выглядел бы совершенно по другому. Тот факт что его код все же компилируется означает только то, что он использует C++ режим работы компилятора, для текста на С. Сколько глюков может вылезти только из этого, я рассказывать не буду.

Некоторые используют C++, как улучшеный C и в этом ничего криминального нет, а вот о "С++ режиме компилятора для текста С" я слышу впервые и глюках в таком "режиме" тоже очень хотелось бы услышать - неужели был опыт?

авторОткуда взялась такая логика чтения файла очень просто - не умеет человек работать со строками в С. Посмотрит на предложеный мной код - найдет много интересного... может быть :)


Как раз, видно, что опыт-то у автора есть и идея в коде присутствует. То что вы ее не разглядели - это ваша проблема.

автор
Но на работу с фиксированой шириной столбцов исходник не походит никак. Ну никак он не будет работать хоть фиксированая там ширина хоть переменная.


А работает ведь, если фиксированная:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// читаем до 30 символа или до конца строки
// согласно, да хотя бы, того же MSDN:
/*
The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string. 
*/
while( fgets(Note[i].FIO,l_fio,file) )
{
     // далее остаток строки помещаем соответственно в телефон и день рождения
     fscanf(file,"%i%i\n",&Note[i].Phone,&Note[i].B_Day);
}

Так что, не правда ваша!

зы: вы либо не думаете, тогда зачем отвечать, либо мне не ясны мотивы столь поверхностных ответов с вашей стороны.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка!!! Проверка на пренадлежность символов... HELP! / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]