Перейти к содержанию

Сравнение строк


Рекомендуемые сообщения

Функция sp в приведенном коде не пашет. Почему - непонятно.

#include <stdio.h>
#include <conio.h>
#include <string.h>

#define N 20

struct car{
	char reg_number[20];
	char *car_model;
	int probeg;
	};

car *D;		// Указатель на ДМ строк таблицы
int n=0,sz=10;	// кол-во строк и размерность ДМ (глобальные)

void extend(){	// проверка на переполнение ДМ и расширение
	if (n!=sz) return;
	sz=sz*2;
	car *q=new car[sz];
	for (int i=0;i<sz/2;i++) q=D;
	delete D;
	D=q;
}

void add(){
	extend();				// не переполнен ли ДМ
	printf("\nRegistration number:"); scanf("%s",D[n].reg_number);
	char c[80];
	gets©;				// читать оставшийся \n из входного потока
	printf("\nModel of car:"); gets©;
	D[n].car_model=strdup©;	// копия строки в ДМ
	printf("\nWay:"); scanf("%d", &D[n].probeg);
	n++;
	}

int get_num(){
	int m;
	do {
		printf("\nn="); scanf("%d",&m);
	} while (m<1 || m>n);
	return m-1;
	}

void show(){
	printf("\n\nN   Registration number\t\tWay\tModel\n");
	printf("--------------------------------------------------\n");
	for (int i=0;i<n;i++){
		printf("%-3d %-20s",i+1,D.reg_number);
		printf("\t%d\t", D.probeg);
		printf("%s\n",D.car_model);
		if((i+1)%20==0) getch();
		}
	}

void save(char f[]){
	FILE *fd=fopen(f,"w");
	fprintf(fd,"%d\n",n);
	for (int i=0;i<n;i++){
		fprintf(fd,"%s\n",D.reg_number);
		fprintf(fd,"%s",D.car_model);
		fprintf(fd,"%d\n\n",D.probeg);
		}
	fclose(fd);
	}

void load(char f[]){
	FILE *fd=fopen(f,"r");
	if (fd==NULL) return;
	int m;
	fscanf(fd,"%d",&m);
	for (;m!=0;m--,n++){
		extend();
		fscanf(fd,"%s",D[n].reg_number);
		char c[80];
		fgets(c,80,fd);					// читать "хвост" предыд. строки
		fgets(c,80,fd);
		D[n].car_model=strdup©;
		fscanf(fd,"%d",&D[n].probeg);
		}
	fclose(fd);
	}

void edit(int k){
    printf("\nEnter new values:\n");
	printf("\nRegistration number:"); scanf("%s",D[k].reg_number);
	char c[80];
	gets©;				// читать оставшийся \n из входного потока
	printf("\nModel of car:"); gets©;
	D[k].car_model=strdup©;	// копия строки в ДМ
	printf("\nWay:"); scanf("%d", &D[k].probeg);
}

void sp(){
  char *s;
  int t=0,p=0;
	printf("\nEnter model of car: ");
	gets(s);
	   for(int i=0; i<n; i++){
	   if (strcmp(s, D.car_model)==0) t=t+D.probeg;
	   p=p+1;
	   }
	t=t/p;

	printf("\nSrednii probeg = %d", t);

	getch();
}

void main(){
int k,i,t;
D = new car[sz];
while(1){
	printf("\n1 - add\n2 - show\n3 - delete\n4 - save\n5 - load\n6 - edit\n7 - Srednii probeg\nwhat to do? ");
	switch(getch()){
case '1':	add(); break;
case '2':	show(); break;
case '3':	if (n==0) break;
			k=get_num();
			for (i=k;i<n-1;i++) D=D[i+1];
			n--;
			break;
case '4':	save("a.txt"); break;
case '5':	load("a.txt"); break;
case '6':       if (n==0) break;
			t=get_num();
			edit(t); break;
case '7':	sp(); break;
case 27:	return;
		}
	}
}
Ссылка на комментарий
Поделиться на другие сайты

я так понял, что это вроде базы данных?

если так, почему не воспользоваться средствами mysql?

для C есть библиотека для работы с ней

Ссылка на комментарий
Поделиться на другие сайты

Хех. Smile

Ну прежде всего это лаба. На работу структур. Поэтому здесь лучшее - враг зачета. Smile

Если проблему описывать конкретнее, то функция strcmp должна возвращать 0, если строки переданные ей одинаковы. Путем отладки выяснено, что проблема в том, что она не корректно сравнивает элемент структуры(формата char *s) с введенной строкой(аналогичного формата). В чем загвозтка понять не могу. Sad

P/S/

Собственноручно написанная функция для сравнения строк эту проблему тоже не решила. Что окончательно поставило в тупик.

Ссылка на комментарий
Поделиться на другие сайты

Guard писал(а) Mon, 02 October 2006 03:32

Собственноручно написанная функция для сравнения строк эту проблему тоже не решила. Что окончательно поставило в тупик.

Дайте и эту функцию, может что и прояснится:)

Ссылка на комментарий
Поделиться на другие сайты

Кажется нашел причину.

При загрузке из файла в переменную типа char *s подгружается символ '\n'. Соответственно, а как от этого избавиться? Smile

P/S/

for (int i=0; s==t; i++);
if (s[i-1]=='\0') printf("Равно!");
Ссылка на комментарий
Поделиться на другие сайты

Guard писал(а) Tue, 03 October 2006 07:53

Кажется нашел причину.

При загрузке из файла в переменную типа char *s подгружается символ '\n'. Соответственно, а как от этого избавиться? Smile

for (i = 0; s != '\0'; i++)

if (s == '\n') {

s = '\0';

break;

}

Ссылка на комментарий
Поделиться на другие сайты

Guard писал(а) Tue, 03 October 2006 13:23

Спасибо. Только я хотел узнать возможно ли от этого избавиться еще при объявлении функции scanf. Smile

Хм... man scanf?

Ссылка на комментарий
Поделиться на другие сайты

Ладно пока исчу - последний вопрос. Как можно отсортировать массив с русскими символами по алфавиту? Very Happy

Или вернее как сравнить русские символы?

Ссылка на комментарий
Поделиться на другие сайты

Guard писал(а) Wed, 04 October 2006 03:12

Ладно пока исчу - последний вопрос. Как можно отсортировать массив с русскими символами по алфавиту? Very Happy

Или вернее как сравнить русские символы?

Самый простой вариант - перевести строку при помощи iconv в cp1251 и отсортировать по возрастанию кодов. В 1251, в отличии от кои8, символы расположены по алфавиту.

man 3 iconv

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...