powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка!!! Проверка на пренадлежность символов... HELP!
19 сообщений из 19, страница 1 из 1
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210199
Andrey_Ohotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ! у меня проблема.. но она разрешимая.. просто по невнимательности, наверно, ... просто из-за проверки одной - полно ошибок вылазит. (проверка на символы перед и после искомого слова)
Суть проги - в считывании строк из файла.. потом, нужно ввести слово с клавы и проверить, есть ли совпадения.. если есть, то вывести эту строку на экран. вот прототип файла, в формате 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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210267
synapse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проглядел бегло, бросается в глаза следующие выражения
Andrey_Ohotin
char *p = Note.FIO;
if(p = strstr(Note.FIO,name))


У вас проблемы с пониманием указателей и строк...
В данном случае вы сравниваете не строки,а адреса...
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210291
synapse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для копирования использый strdup
а для сравнения strcmp
_______________________________________________________________
@Мы медленно запрягаем, быстро ездим, и сильно тормозим.@
...
Рейтинг: 0 / 0
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210358
Фотография 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 попользовались чтоль - лично мне разбираться в таком неряшлевом оформлении просто лень, думаю большинству других тоже.
...
Рейтинг: 0 / 0
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210413
synapse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210442
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
synapse

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

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

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

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

Код: 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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33210721
Фотография v6y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey_Ohotinвот более понятная запись проги... так и не пойму.. в чем ошибка-то...

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

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

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

Код: 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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33211443
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догон:

Проблема была в том, что ты не проверял, что возвращает fgets, а зря, поскольку при чтении последней строки файла eof еще не взведен - мы не перевели каретку. Именно вызов fgets при i = 3 возвел признак конца файла, а ты это и прозявил. В памяти для 4 элемента (i==3) у тебя остался стековый мусор, этот мусор и привел к ошибке.
...
Рейтинг: 0 / 0
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33211456
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33211474
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33211513
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, зажаривает Андрей Петрович! Супер!!!
Мы еще от "Массив! маленькая, интересная задачка.."-и не отошли, а он нам еще наготовил! А тут еще White Owl со своими придирками невтемными - 1ая фигня, вторая...

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

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

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

для SeraTJ: я не пользовался отладчиком :)
...
Рейтинг: 0 / 0
Ошибка!!! Проверка на пренадлежность символов... HELP!
    #33211831
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка!!! Проверка на пренадлежность символов... HELP!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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