• SDN Forum üyelikleri çok yakında yeniden açılıyor. Siz de bu büyük topluluğun bir parçası olmak için bizi takipte kalın, gelişmeleri kaçırmayın!

C'de String Atama Sorunu

NoWeDoR

Öğrenci
Katılım
14 Temmuz 2015
Mesajlar
9
Reaksiyon puanı
0
Puanları
1
Arkadaşlar aşağıdaki programı çalıştırdıktan sonra ana menüden 1 girerek bir adet kayıt alıyorum kullanıcıdan. Atıyorum ad q soyad q numara 123123 olarak girilsin.


Daha sonra delete fonksiyonunu kullanarak (ana menüden 5 girerek) bu girdiğim kaydı silmek için oraya tekrar atama yapmak istiyorum. (Ad, soyad ve numara 0 degerine ya da NULL değerine eşit olsun diye uğraşıyorum) Ancak ne denediysem atamayı delete fonksiyonu içersinde bir türlü yapamadım. Kod satırlarında ((( deletE() fonksiyonunda ))) yaptığım atamalara (// olarak yorum satırlarında) bakabilirsiniz.


Acaba nasıl atama yapılmalı ?

Kod:
#include <stdlib.h>      // "stdlib" library contains of exit() function
#include <malloc.h>     // "malloc" library contains of malloc() function
#include <Windows.h>   // "Windows" library contains of Sleep() function which waits the system as you want
#include <io.h>       // "io" library contains of filelength() function
#include <string.h>  // "string" library contains of strlen() function
#include <stdio.h>  // "stdio" library contains of other functions which hasn't been mentioned


typedef struct personKnowledge   // Structe and it's elements are being defined
{
	char name[32];
	char surname[32];
	char number[32];
};


FILE *ptrFILE, *ptrFILE1;   // Variables are being defined
long int recordLength, totalRecordLength, location;
int choice, number, totalRecordNumber, i;
static int counter = 0;


int menu();   // Functions are being defined
void newRecord();
void display();
void update();
void add();
void deletE();


int main()   // Program is being initialiezed 
{
	menu();
	return 0;
}


int menu()   // Options are being presented to user 
{
	do
	{
		printf("\n\t\t --- Phone Book Program ---");
		printf("\n\n\t\t 1) Open file and record someone");
		printf("\n\n\t\t 2) Display person knowledge");
		printf("\n\n\t\t 3) Update person knowledge");
		printf("\n\n\t\t 4) Add person to list");
		printf("\n\n\t\t 5) Delete someone");
		printf("\n\n\t\t 6) Exit");
		printf("\n\n\nEnter your choice: ");
		choice = 0;
		scanf("%d", &choice);
		fflush(stdin);
		switch (choice)
		{
		case 1:
		{
			newRecord();
			break;
		}
		case 2:
		{
			display();
			break;
		}
		case 3:
		{
			break;
		}
		case 4:
		{
			break;
		}
		case 5:
		{
			deletE();
			break;
		}
		case 6:
		{
			printf("\nWorking has been completed.\n");
			return 0;
		}
		default:
		{
			printf("\nWrong entry! The program has been terminated.\n");
			break;
		}
		}
	} while (choice >= 1 && choice <= 6);
}


void newRecord()   // This function opens a file and records one person in file
{
	if (counter > 0)
	{
		system("cls");   // Screen is being cleaned
		Sleep(350);     // Sleep functions waits user for a while
		printf("\nYou have already entered '1' and opened a file. To add a person please enter '4'\n");
		return;
	}
	else
	{
		if ((ptrFILE = fopen("Phone Book.dat", "wb")) == NULL)   // wb is binary writing mode
		{
			printf("The file couldn't be opened\n");
			exit(EXIT_SUCCESS);
		}
		system("cls");
		Sleep(350);
		personKnowledge *p;   // p = (Person)
		p = (personKnowledge *)malloc(sizeof(personKnowledge));   // Memory is being allocated
		fflush(stdin);   // Cache memory is being cleaned
		recordLength = sizeof(*p);
		printf("\n\Express person name: ");   // User is entering the person's knowledge and they are being saved in file
		fgets(p->name, sizeof(p->name), stdin);
		size_t wordLength = strlen(p->name);  // "size_t is unsigned integer type"
		if (wordLength > 0 && p->name[wordLength - 1] == '\n')   // This if idiom has been used for sentence seperation
		{
			p->name[--wordLength] = '\0';
		}
		printf("Express %s's surname: ", p->name);
		fgets(p->surname, sizeof(p->surname), stdin);
		printf("Express %s's number: ", p->name);
		fgets(p->number, sizeof(p->number), stdin);
		fwrite(&(*p), recordLength, 1, ptrFILE);   // Knowledge which has been got from user is being saved in file processionally
		printf("\nPlease wait, information is saving to file..\n");
		Sleep(750);
		printf("*-* Saving operation has been completed succesfully. *-*\n");
		free(p);   // Allocated part of memory is being released
	}
	fclose(ptrFILE);   // File is being closed
	counter++;
}


void display()   // If there is person knowledge which is searched in file, this function reads it and prints on the screen
{
	if ((ptrFILE = fopen("Phone Book.dat", "rb")) == NULL)   // rb is binary reading mode
	{
		printf("The file couldn't be opened\n");
		exit(EXIT_SUCCESS);
	}
	system("cls");
	Sleep(350);
	personKnowledge *s;   // s = (Searching)
	s = (personKnowledge *)malloc(sizeof(personKnowledge));
	recordLength = sizeof(*s);   // Necessary location calculations are being done and person's knowledge is being displayed
	totalRecordLength = filelength(fileno(ptrFILE));   // The equalities explains what the purpose is from 137th line to 145th line 
	totalRecordNumber = totalRecordLength / recordLength;
	printf("\n\nExpress person record number which you search: ");
	number = -791673918435;
	scanf("%d", &number);
	fflush(stdin);
	printf("\n*-* Person knowledge which you search *-*\n");
	Sleep(750);
	location = (number - 1)*(recordLength);
	fseek(ptrFILE, location, SEEK_SET);   // The cursor locates place which is searched with fseek() function
	if (fread(&(*s), recordLength, 1, ptrFILE) != 0 && number > 0)  // If there is knowledge in that location and numbeer is greater than 0
	{
		printf("Name: %s\n", s->name);
		printf("Surname: %s", s->surname);
		printf("Number: %s", s->number);
	}
	else
	{
		printf("There is no record like this.\n");
		return;
	}
	free(s);
	fclose(ptrFILE);
}




void deletE()
{
	if ((ptrFILE = fopen("Phone Book.dat", "rb+")) == NULL)
	{
		printf("The file couldn't be opened\n");
		exit(EXIT_SUCCESS);
	}
	system("cls");
	Sleep(350);
	personKnowledge *del;   // del = (Deleting)
	del = (personKnowledge *)malloc(sizeof(personKnowledge));
	fflush(stdin);
	recordLength = sizeof(*del);
	totalRecordLength = filelength(fileno(ptrFILE));
	totalRecordNumber = totalRecordLength / recordLength;
	printf("\nExpress person number which you want to delete: ");
	scanf("%d", &number);
	fflush(stdin);
	fseek(ptrFILE, (number-1)*recordLength, SEEK_SET);
	if (fread(&(*del), recordLength, 1, ptrFILE) != 0 && number > 0)  // If there is knowledge in that location and number is greater than 0
	{
		Sleep(350);
		printf("*-* The record which is cleaned *-* \n", number);
		printf("Name: %s\n", del->name);
		printf("Surname: %s", del->surname);
		printf("Number: %s", del->number);
		// del->name = "";         <<<<<<<<<<<<<<<<<< :(      ??   ??   ???   ?
		// del->name = {};          <<<<<<<<<<<<<<<<<< :(             ?  ?  ??   ?? ? 
		// &(*del).name = "";         <<<<<<<<<<<<<<<<<< :(               ?   ? ?   ?? ?  ? ??
		// &(*del).name = {};           <<<<<<<<<<<<<<<<<< :(     ??  ??  ?     ??  
		// strcpy(del->name, "");      <<<<<<<<<<<<<<<<<< :(                 ???   ?              ?? ?? ? 
		// del->name = NULL;           <<<<<<<<<<<<<<<<<< :(                   ???   ?    ?? ?  ? ?
		// strcpy(del->name, NULL);     <<<<<<<<<<<<<<<<<< :(     ??  ??  ?     ?? 
	}
	else
	{
		Sleep(350);
		printf("There is no record like this.\n");
		return;
	}
	fclose(ptrFILE);
	free(del);
}
 
Üst