Προς το περιεχόμενο

Mia ergasia se C Language.


Barf

Προτεινόμενες αναρτήσεις

Δημοσ.

Exo mia ergasia se c-language me arrays/pointers ktl... Einai ena mathima to opoio to exo pari 2 fores kai den to exo perasi... mono kai mono epeidi me berdevoun apistefta ta pointers/arrays.

 

Parakato einai to link tis ergasias. Distixos einai sta agglika, alla ean thelete help tha prospathiso na to metafraso.

 

http://img72.imageshack.us/img72/617/img001nd1.jpg

 

Lei o kathigitis oti to 1 kai 2 meros mazi kanoun to 3.

As mou eksigisi kapios ti einai ola auta ta kinezika bas kai to peraso to mathima... :(

Δημοσ.

Δεν με πειθεις φιλε barf οτι εχεις προσπαθησει αρκετα.Η ασκηση ειναι ευκολη.Με λιγη προσπαθεια θα την καταφερεις.Τωρα να σου εξηγησουμε τα βασικα ειναι λιγο δυσκολο,γι αυτο ειναι τα βιβλια,αν σε ενδιαφερει να μαθεις c τοτε πρεπει να δουλεψεις μονος σου..Να παιδευτεις μεχρι να τα καταφερεις,μονο ετσι θα μαθεις.Αρχισε να διαβαζεις θεωρια για pointer κ εργασια με αρχεια δισκου,κ παιξε με απλα παραδειγματακια μονος σου.

Δημοσ.

Ούτε εμένα με πείθεις.

 

Κάνε κάποια συγκεκριμένη ερώτηση αν θες βοήθεια.

 

Ορίστε όμως ένα μικρό παράδειγμα που έφτιαξα, τρέξε για να δεις πως μπορείς με ένα pointer να προσπελάσεις ενα line of text που σου ζητάει η άσκηση.

 

>
#include <stdio.h>
#include <stdlib.h>

int main () {

   char* line_of_text = (char*)malloc(100*sizeof(char)) ;
   gets(line_of_text);

   while (*line_of_text) {

       printf("\n-%c-\n",*line_of_text);
       line_of_text++;
   }
}

Δημοσ.

Pros to paron katafera na vro ena paromoio example, alla den psaxni na vri tin leksi mesa sto string, aplos sou evgaze to proto gramma tou kathe string... (as poume ta arxika tou mikrouo kai tou epithetou sou)

 

#include <stdio.h>

 

char first[20],last[20];

void initials(char f[20], char l[20]);

main()

{

printf("give first and last name :");

scanf("%s%s",first,last);

initials(first,last);

printf("%s\n%s\n",first,last);

}

 

void initials(charf[20],char l[20])

{

printf("%c\n",f[0],l[0]);

f[0]='2';

l[0]='2';

}

 

1n erotisi: Tora den katalavaino giati bike to f[0]='2'; kai to l[0]='2'; ti einai auto to 2?

 

2n erotisi: ean etsi peripou prepi na einai kai i proti askisi, mono pou to first einai to text string "to be or not to be", kai to last einai i leksi pou psaxnoume, as poume "be", pos to kanoume na psaksi tin sigekrimeni leksi?

 

 

 

mexri stigmis exo skefti kati tetoio...

 

#include <stdio.h>

 

 

char text[50], word[10];

 

void leksi(char text[50], char word[10]);

 

main()

{

printf("Give me a line of text : ");

scanf("%s", text);

 

printf("Give me a word : "):

scanf("%s",word);

 

Printf("Found in position ")

 

 

void leksi(char text[50]. char word[10])

{

printf("c%\n",text[], word[]);

text[]='';

word[]='';

}

 

An boreite na mou dosete ena hint peripou, an to kano sosta i lathos, kai einai sosto, ti parapano prepi na kano.

Δημοσ.

To thema einai na katalabeis oti stin ousia prokeitai gia ena brute force attack se ena string.Fylas se ena string mia frash kai meta me dedomenh thn leksh psaxneis sto string gia tin leksi.

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

int findWordinText(char *string, char *word)
{
int i = 0;
for(i = 0; i < strlen(string); i++)
{
	int j = 0;
	int k = 0;
	if(string[i] == word[j] && string[i-1] == ' ')
	{
		k = i;
		for(j = 0; j < strlen(word) && word[j] == string[k]; j++,k++);
		if(j == strlen(word) && (string[k] == ' ' || string[k] == '\0'))
			return i;
	}
}
return 0;
}
//main code
int main(int argc, char **argv)
{
char *string = "To be or not to be";
char *word = "be";
if(findWordinText(string,word))
{
	printf("Word %s was found in position %d\n",word,findWordinText(string,word));
}
else
{
	printf("Not found.\n");
}
printf("Hit any key to continue.");
getch();
return 0;
}

Ayto apanta sto 1a alla na ksereis oti prepei na psaxteis ligo,ennoeitai oti mporei na yparxoyn bugs.

Ena bug einai oti an baleis se mia frash char *string = "Monday is a nice day"; kai exoume char *word = "day"; tote tha bgalei gia prwth leksh to "day" apo to Monday, se afhnw mono soy na to breis..

//Ante bug corrected...

//Second bug corrected, tired of searching for other senaria...

Δημοσ.

int main(int argc, char **argv) ----->ti einai? den to exoume kani auto...

 

 

int i = 0;

for(i = 0; i < strlen(string); i++)

{

int j = 0;

int k = 0;

if(string == word[j] && string[i-1] == ' ')

{

k = i;

for(j = 0; j < strlen(word) && word[j] == string[k]; j++,k++);

if(j == strlen(word) && (string[k] == ' ' || string[k] == '\0'))

return i;

}

}

return 0;

 

Auto dimiourgi ena for loop, pou lei efoson to i einai mikrotero tou strlength tou string, kane i++

 

alla auto pou den katalavaino einai gia pion logo to kanoume auto?

den exoume kani auto pou eipes bokarinho "bruteforce" kai tetia...

Δημοσ.

Γιατί δεν πρέπει να ελένξεις χαρακτήρα - χαρακτήρα το string σου για να το συγκρίνεις με την λέξη που σου δίνει ;; Πως αλλιώς θα δείς ότι είναι όμοια ;

 

Κάθε string είναι ένας χαρακτήρας !

 

Πείραξε λίγο τα παραδείγματα για να δεις τι γίνετε και να καταλάβεις πως πάει !

Δημοσ.

Eyxaristw gia tin apantisi sto erwthma,

oson afora to int main(int argc, char **argv) kane to se

int main(void) kai tha eisai mia xara episis.

A bgale kai to return 0 sto telos tis main mia kai to void simainei oti den epistrefetai tipota.

Twra to ti einai to argc kai to argv efoson den exeis idiaiteres programmatistikes gnwseis den tha katalabeis kai an soy pw. An thes omws psakse to sto Google.

Allwste to Google einai o kalyteros filos toy anthrwpoy..

 

PS: To brute force ksexase to...

Δημοσ.

lol... kai ton skilo pou ton vazis :S (oxi oti exo , alla etsi lene kapoia atoma)

 

ok... tha doulepso kai ligo akoma avrio kai tha ertho me nees erotisis.

 

thanks for the help so far

Δημοσ.

Είπα να σε βοηθήσω λίγο ακόμα!

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

//Functions
char* PrintSpecificLine(char *inputFile,int FileLine)
{
if(inputFile && FileLine > 0)
{
	int c;
	int i = 0;
	int j = 0;
	int k = 0;
	FILE *fp = fopen(inputFile,"r");
	if(!fp)
	{
		fprintf(stderr,"Error can not open %s file.",inputFile);
		exit(1);
	}
	else
	{
		char string[1024] = "";
		while((c = fgetc(fp)) != EOF)
		{
			if(c == '\n')
				i++;
		}
		if(FileLine > i || FileLine < 0)
		{
			printf("Error in Line Number,Bad input.\n");
			return NULL;
		}
		else
		{
			fseek(fp,0,SEEK_SET);
			while((c = fgetc(fp)) != EOF)
			{
				if(j == FileLine-1)
					string[k++] = c;
				if(c == '\n')
					j++;
			}
		}
		fclose(fp);
		return string;
	}
}
else
{
	return NULL;
}
}
// Main Code
int main(int argc, char **argv)
{
int number = 0;
char *line = NULL;
printf("Give me the a Line number:");
scanf("%d",&number);
line = PrintSpecificLine("filename.txt",number);
printf("%s\n",line);
printf("Hit any key to continue.");
getch();
return 0;
}

Αυτό που σου μένει να κάνεις για να την τρέξεις είναι να δημιουργήσεις ένα αρχείο με το όνομα filename στο notepad και να γράψεις αυτά που θέλεις.

Καλή συνέχεια.

Δημοσ.

Μια εναλλακτική αλλά ενδεχομένως περιπλοκότερη λύση για τον εντοπισμό κειμένου, είναι η χρήση της ANSI-C ρουτίνας strstr (string.h) η οποία επιστρέφει την θέση έναρξης ενός sub-string εντός ενός string.

 

Για την ιστορία λοιπόν..

 

Αυτή η ιδιότητα της strstr στην περίπτωση μας (εύρεση λέξεως) πρέπει να συνδυασθεί με την συνθήκη πως κάθε sub-string για να θεωρηθεί λέξη πρέπει να βρίσκεται μεταξύ ενός εναρκτήριου (leading) και ενός τελικού (trailing) κενού (space) καθώς η strstr δεν διακρίνει σημεία στίξης (οπότε αν έχουμε “Hello” και ζητηθεί ως λέξη το “He” θα επιστραφεί η θέση του “He”, παρόμοιο αποτέλεσμα θα έχουμε αν ζητηθεί “lo”, “ll” ή “el” κτλ.)

Με την διαφορά όμως πως το εναρκτήριο κενό (leading) πρέπει να υφίσταται όταν η υποψήφια λέξη δεν αποτελεί την εναρκτήρια λέξη του string μας, σε διαφορετική περίπτωση το κενό (ή κενά) πρέπει να αφαιρούνται (leading-trim –περίπτωση “He”) και συνάμα να θυμόμαστε των αριθμό τους ώστε να τα συνυπολογίζουμε στην θέση της εντοπισμένης λέξης μας.

Αντίστροφα όταν η υποψήφια λέξη είναι συνάμα η τελική λέξη του string πρέπει να ακολουθείται από ένα κενό (trailing), σε διαφορετική περίπτωση το κενό πρέπει να προστίθεται στο string (η περίπτωση εντοπισμού του “el” εξαλείφεται επιτυχώς από την δεύτερη συνθήκη).

Σε κάθε περίπτωση, λοιπόν η λέξη πρέπει να περικλείεται (με σεβασμό στον πρώτο & δεύτερο κανόνα) από leading & trailing spaces.

 

Αναθεώρηση, έκδοση 1.2: Και η προς εύρεση λέξη θα πρέπει να ακολουθείται από ένα κενό ώστε να αντιμετωπίζονται περιπτώσεις όπως "this becomes be" όπου η strstr θα επιστρέψει το "be"come και όχι το "be" εάν ζητηθεί το τελευταίο ως προς εύρεση λέξη!

 

Ακολουθεί κώδικας γραμμένος σε CodeGear Turbo C++ Explorer που ζητά ένα string και δοκιμάζει να εντοπίσει την θέση κάποιας λέξης, φυσικά μπορεί να υπάρχουν bugs ή άλλου είδους αβλεψίες.

 

>
/*-Find Word (directx)--------------------------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef __BORLANDC__	/* CodeGear/Borland magic  */
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
int	_FindWord(char*,char*);

#ifdef __BORLANDC__ /* CodeGear/Borland magic  */
#pragma argsused
#endif
int main(int argc, char* argv[])
{
char	*pszLine = NULL,
			*pszWord = NULL;
int		 nResult;

/*
		Allocate two BUFSIZ buffers to store Line & Word.
		(BUFSIZ on CodeGear Turbo C++ is equal to 512bytes) 
*/

if((pszLine=(char*)malloc(BUFSIZ))==NULL)
 printf(" Not enough memory for Line buffer!\n");
else
 if((pszWord=(char*)malloc(BUFSIZ))==NULL)
	printf(" Not enough memory for Word buffer!\n");
 else
	{
		memset(pszLine,0,BUFSIZ-1);
		memset(pszWord,0,BUFSIZ-1);

		/*
				Ask user input..
		*/
		printf(" Enter Line:"); gets(pszLine);
		printf(" Enter Word:"); gets(pszWord);

		/*
       	Call _FindWord, if ==-1 then "Word Not Found" else "Word-Position".
		*/
		if((nResult=_FindWord(pszLine,pszWord))!=-1)
		 printf(" Word found at %d\n",nResult);
		else
		 printf(" Word not found!\n");
	}

/*
		Resources clean-up!
*/
free(pszLine); free(pszWord);

/*
   	User exit confirmation!
*/
printf(" Press Enter to quit..");
fgetc(stdin);

/*
   	Always exit with no-error (0).
*/
return 0;
}
/*---------------------------------------------------------------------------*/
int	_FindWord(char *pszLine,char *pszWord)
{
/*
		Return the possition of the first word occurance in pszLine.
		Tip: Search is "Case-Sensitive" (abcd differs from ABCD).

		V.1.2 - pszWord should also have space else we fail
						on "this becomes be" (cannot find "be" because strstr
						points to [be]come)
						Bug credit goes to "bokarinho" (Thanks!) 
*/
char  *pBuffer = NULL,
       *pWord   = NULL,
			*pResult = NULL;
int	  nPosition, nTrimSpaces = 0;

/*
		Copy pszLine to our own private buffer
		(+2 to include '\n' and possible trailing ' ')

   	1.2+ Do the same for pszWord
*/
if((pBuffer=(char*)malloc(strlen(pszLine)+2))==NULL)
 return -2; /* Memory fault! */
strcpy(pBuffer,pszLine);

if((pWord=(char*)malloc(strlen(pszWord)+2))==NULL)
 {
		free(pBuffer); /* Memory fault*/
		return -2;
 }
strcpy(pWord,pszWord);

/*
		1.2+ pszWord should have [one] trailing space!
				 So we trim (remove) all trailing spaces and add [one].
*/
for(nPosition=strlen(pWord);nPosition>0;nPosition--)
 if(pWord[nPosition]!=' ' && pWord[nPosition-1]==' ')
	{
		 pWord[nPosition-1] = '\0';
		 break;
	}
 strcat(pWord," ");

/*
		Trim (cut) leading (left) spaces.
*/
if((nPosition=strspn(pBuffer," ")-1)!=-1)
 {
		strcpy(pBuffer,&pBuffer[nPosition+1]);
		/* Store the number of trimed spaces. */
		nTrimSpaces = nPosition+1;
 }

/*
		Add trailing (right) space, if needed.
*/
if(pBuffer[strlen(pBuffer)-1]!=' ')
 strcat(pBuffer," ");

/*
		Search the first occurance of pszWord within pBuffer.
		(If we trim leading space(s) then add them to result,
		 because user-input may count them).
*/
if((pResult=strstr(pBuffer,pWord))!=NULL)
 {
		/* With pointer mathmatics find pWord position in pBuffer. */
		nPosition = (pResult-pBuffer);

		/* A valid Word should have both a leading (left) space.. */
		if(nPosition>0)
		 if(pBuffer[nPosition-1]!=' ')
			{ free(pBuffer); free(pWord); return -1; }

		/* ..and a trailing (right) one. */
		if(nPosition+strlen(pWord)<=strlen(pBuffer))
		 if(pBuffer[nPosition+strlen(pWord)-1]==' ')
			{ free(pBuffer); free(pWord); return nPosition+1+nTrimSpaces; }
 }

/* No valid word found! */
free(pBuffer);
free(pWord);	/* 1.2+ */
return -1;
}

 

Υ.Γ.

α) Θυμηθείτε πως η αναζήτηση της _FindWord είναι Case-Sensitive δηλαδή διακρίνει μεταξύ μικρών & κεφαλαίων χαρακτήρων (για βελτίωση δείτε τις strupr/strlwr).

β) Η ρουτίνα αναγνωρίζει ως διαχωριστικά λέξεων μόνο κενά – με μια μικρή τροποποίηση στην έναρξη της αυτό εύκολα αλλάζει και για άλλα σημεία στίξεων (πχ. εάν ispunct -> [x]=ʽ ʽ –για ispunct δείτε ctype.h).

 

Καλή συνέχεια!

Δημοσ.

Ασχέτως ότι ίσως είναι περιπλοκότερο, δεν πιστεύω ότι τους επιτρέπει να χρησιμοποιούν τις συναρτήσεις του string.h ! Και δεν του κάνετε καλό να του τα δίνετε έτοιμα ρε παιδιά !

Δημοσ.

Πρόσεξε την φράση μου Για την ιστορία λοιπόν..

 

Από εκεί και πέρα, δεν πρόκειται να μπω σε διαξιφισμό με κανέναν :D

Δημοσ.

kala... to post pou ekane o directx, thanks re si, alla auta den paizi na ta katalavo pote... kai ase pou paizi na min ta kseri o idios o kathigitis. lol. pantos, me ta proigoumena examples kati exo palepsi na kano... tha tou miliso tin deftera na do ti tha mou pei.

Δημοσ.

Κοίτα δεν είναι και κάτι τρελό αυτό που έχει κάνει ο XD. Απλά η strstr επιστρέφει ένα δείκτη στην πρώτη εμφάνιση του substring που ψάχνεις μέσα στο μεγάλο string ή buffer πες το όπως θες. Αν δεν το βρει τότε επιστρέφει μηδέν. Λοιπόν γνωρίζοντας αυτό μετά διαχειρίζεται τα κενά δηλαδή πρέπει να υπάρχουν ανάμεσα στην λέξη 2 κενά ή κενό και αλλαγή γραμμής ή κάτι τέτοιο για να θεωρηθεί ενιαία λέξη και όχι υπολέξη δηλαδή λέξη συνθετικό μέσα σε μία άλλη μεγαλύτερη λέξη. Είναι σημαντικό να καταλάβεις ότι αυτό που κάνει έιναι να βρίσκει με pointer arithmetics το που βρίσκεται ο πρώτος χαρακτήρας του υποstring(μέσα στο μεγάλο)έτσι ώστε να μπορεί να δεσμεύει χώρο για τα υπόλοιπα βοηθητικά μπάφερ στην συνάρτηση του και να κάνει τις συγκρίσεις που θέλει. Είναι κοινή λογική μεταφρασμένη σε προγραμματιστική ευχαίρεια που κατέχει ο XD. Αυτά από εμένα και καλή συνέχεια, αν είπα κάποια πατάτα ας με διορθώσει ο ίδιος ο δημιουργός του άνωθεν προγράμματος.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...