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

C προγραμματισμός


gitz

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

Δημοσ.

γεια σας... μήπω ξέρετε εαν υπάρχει κάποια συνάρτηση στην C η οποία να παίρνει σαν ορίσματα μία λέξη και μία πρόταση και να μ επιστρέφει εάν η λέξη αυτή υπάρχει στην πρόταση??? ευχαριστώ...

Δημοσ.

φίλε μου την ξέρω την strcmp αλλά αυτή συγκρίνει δύο strings να δει αν είναι ίδια... πχ το sting "hello" με το string "hello"... εγώ θέλω πχ σε μία πρόταση "hello world" να μ λέει εάν υπάρχει πχ το string "hello"... φίλε drek πώς συντάσσεται η strindex???

Δημοσ.

Δύο char* ως ορίσματα και επιστρέφει σε ποια θέση του πρώτου συναντάται για πρώτη φορά το δεύτερο. Αν δεν υπάρχει το δεύτερο στο πρώτο, επιστρέφει 0.

Δημοσ.
γεια σας... μήπω ξέρετε εαν υπάρχει κάποια συνάρτηση στην C η οποία να παίρνει σαν ορίσματα μία λέξη και μία πρόταση και να μ επιστρέφει εάν η λέξη αυτή υπάρχει στην πρόταση??? ευχαριστώ...

 

Αν σε ενδιαφέρει η ANSI-C δες την strstr από string.h μπορεί να σε καλύψει, διαφορετικά μπορείς να πας σε πιο τυπικές λύσεις όπως η strtok για παράδειγμα.

Δημοσ.
γεια σας... μήπω ξέρετε εαν υπάρχει κάποια συνάρτηση στην C η οποία να παίρνει σαν ορίσματα μία λέξη και μία πρόταση και να μ επιστρέφει εάν η λέξη αυτή υπάρχει στην πρόταση??? ευχαριστώ...

 

Το πρόβλημα είναι σχετικά δύσκολο. Υπάρχει η συνάρτηση strstr η οποια ψάχνει για substring σε string. Όμως, θα βρείς την λέξη "and" να υπάρχει στην έξεις αγγλική πρόταση:

 

>
strstr("and", "Η have a music band.");

 

Αυτό που σου προτείνω είναι να κανεις tokenization, δηλαδή να χωρίσεις την κάθε λέξη ξεχωριστά, και να κανεις ένα lower-case comparison (γιατί η strcmp είναι case-sensitive).

 

Για να χωρίσεις τις λέξεις μπορείς να χρησιμοποιήσεις την συνάρτηση strtok(). Για παράδειγμα:

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

 

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

int casecmp(const char *s1, const char *s2) {
 while(tolower((unsigned char)*s1) == tolower((unsigned char)*s2)
       && *s1) s1++, s2++;
 return *s1 - *s2;
}
int main ()
{
 char str[] = "- This, a SAMPLE string.";
 char word[] = "sample"
 char * pch;
 pch = strtok(str, " ,.-");
 while (pch != NULL)
 {
   if(casecmp(pch, word) == 0)
       printf("'%s' found.\n", word);
   pch = strtok (NULL, " ,.-");
 }
 return 0;
}

Δοκίμασε αυτό.

Δημοσ.

Η χρήση του strstr για εντοπισμό word-tokens σε μια πρόταση προϋποθέτει πως θα πρέπει να εκμηδενισθεί η πιθανότητα ambiguity (ασάφεια) μεταξύ μιας πραγματικής λέξης και ενός substring που θα μπορούσε να υπάρχει ως τμήμα κάποιας λέξης.

 

Ένας γρήγορος κανόνας είναι να θεωρήσουμε ότι κάθε λέξη δεξιά και αριστερά της περιέχει κενό, οπότε σε αυτή την περίπτωση το strstr μπορεί να φανεί χρήσιμο.

 

Ο παρακάτω κώδικας δέχεται μια πρόταση, εξασφαλίζει ότι η έναρξη και η λήξη της περιέχουν κενό, κάνει capitalize το κείμενο για case insensitive αναζήτηση, αντικαθιστά διάφορα σημεία στίξης που δηλώνουν τέλος πρότασης σε κενό και τέλος εφαρμόζει ένα strstr στο οποίο το substring οφείλει να δηλωθεί ως (sp)substring(sp), πχ: “ band ”.

 

>
/*-Find a word-token with strstr directx-------------------------------------*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
int _strstrfind(char *pszBuffer, char *pszToken);

#ifdef __BORLANDC__
#pragma argsused
#endif
int main()
{
printf("[and]?%s\n",
	_strstrfind("Η have a music band.", " AND ")?
	"Found": "Not found");
printf("[band]?%s\n",
	_strstrfind("Η have a music band.", " BAND ")?
	"Found": "Not found");

printf("\nPress Enter to exit..");
getchar();
return 0;
}
/*---------------------------------------------------------------------------*/
int _strstrfind(char *pszBuffer, char *pszToken)
{
/* Try to find a word-token within pszBuffer using strstr */
int nResult = 0;
char *pszContainer = NULL;

/* Instant pszContainer fill with zeroes */
if((pszContainer = (char*)calloc(1, strlen(pszBuffer) + 3)) != NULL)
{
	unsigned nIdx;
	/* Fill pszContainer with spaces (but save last!) */
	memset(pszContainer, ' ', strlen(pszBuffer) + 2);
	strncpy(&pszContainer[1], pszBuffer, strlen(pszBuffer));
	/* Swap .,- with space, else capitalize character */
	for(nIdx = 0; nIdx < strlen(pszContainer); nIdx++)
	{
		char *ptrChar = &pszContainer[nIdx];
		if(*ptrChar == '.' || *ptrChar == ',' || *ptrChar == '-')
			*ptrChar = ' ';
		else
			*ptrChar = toupper(*ptrChar);
	}
       /* Also, capitalize pszToken */
	for(nIdx = 0; nIdx < strlen(pszToken); nIdx++)
		pszToken[nIdx] = toupper(pszToken[nIdx]);
	/* Apply strstr on pszContainer */
	nResult = strstr(pszContainer, pszToken) != NULL;
	/* Free local resources */
	free(pszContainer);
}
/* Return. */
return nResult;
}

 

Σίγουρα το tokenizing είναι η καλύτερη λύση στο πρόβλημα βέβαια, αλλά η διερεύνηση των δυνατοτήτων της strstr έχει αρκετό ενδιαφέρον οπότε αποφάσισα να δημοσιεύσω αυτή την μικρή "αλχημεία".

 

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

 

Υ.Γ.

Ο κώδικας έχει δοκιμασθεί σε C++ Builder 2009 και μπορεί να περιέχει bugs ή άλλες αβλεψίες.

Δημοσ.

Δοκιμασε και με αρχεια...να βαζεις στο αρχειο την προταση που θες και μετα με τις συναρτησεις της string.h να βλεπεις αν ειναι μεσα..

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

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

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