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

scanarisma strings στη C


xalia

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

έχω ένα string που το έχει δώσει ο χρήστης. Δημιουργώ άλλο ένα με το ίδιο μήκος αλλά κενό, με παύλες ή τελείες. Αυτό που θέλω είναι να ελέγχω το ένα string για ένα γράμμα, που το δίνει ο χρήστης με scanf και αν το βρίσκει να το εμφανίζει στο άλλο string. Σκέφτηκα να το κάνω με strchr αλλά έχω κολλήσει και δε ξέρω πώς να το προχωρήσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό μου θυμίζει λίγο Κρεμάλα, έτσι λοιπόν μιας και είχα λίγο χρόνο, είπα να γράψω μια Κρεμάλα σε ANSI-C η οποία θα βασίζεται στην memchr για τον εντοπισμό των προς ανεύρεση chars.

 

Τα σχόλια στο source πιστεύω πως θα βοηθήσουν αρκετά για το πώς & γιατί, bugs φυσικά μπορεί να υπάρχουν καθώς το έγραψα γρήγορα εν μέσο άλλου project.

 

Μια λεπτομέρεια, ο κώδικας είναι case-sensitive, δηλαδή ξεχωρίζει μεταξύ πεζών & κεφαλαίων γραμμάτων οπότε προσοχή (για case-insensitivity δείτε τις toupper/tolower).

 

Ελπίζω να φανεί χρήσιμο.

 

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

 

>
/*-Simple Lame Hangman in C-by Directx-R3-----------------------------------*/
#include <stdio.h>
#include <string.h>
#ifdef  __BORLANDC__
   #pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
#ifdef  __BORLANDC__
   #pragma argsused
#endif
int main(int argc, char* argv[])
{
   char szGuessMe[bUFSIZ] = "",
        szEmpty  [bUFSIZ] = "";
   int  nKey = 0;

   /*
    * Let's read from the STDIN up to sizeof(szGuessMe) bytes into szGuessMe
    * variable.
    */
   printf(" Enter String to be guessed by User (Enter to quit):");
   fgets(szGuessMe,sizeof(szGuessMe),stdin);

   /* fgets applies \n to the end of szGuessMe so we must remove it */
   szGuessMe[strlen(szGuessMe)-1] = '\0';

   /* Quit? */
   if(strlen(szGuessMe))
    {
       /* Setup a szEmpty string full of dots (.) */
       memset(&szEmpty,'.',strlen(szGuessMe));

       printf(" To abort, press: .+Enter else to input: Character+Enter\n\n");

       /* Game - Loop */
       do{
           /* Match Key in szGuessMe with memchr ... */
           char   *ptrCharPos  = NULL;
           static int  nCharsFound = 0;

           /* Did we solve the game? */
           if(strlen(szGuessMe)==(size_t)nCharsFound)
            {
               printf(" Congratulation, you guessed the word!");
               break;
            }

           /*
            * Just to get rid of the Enter key-stroke that getchar always
            * store into keyboard buffer.
            */
           if(nKey=='\n')
               continue;

           /*
            * Did memchr found a matching char? If so, calculate it's position
            * until all matching chars are found.
            */
           for(;
            {
               int nCharPos;
               /*
                * If Char found, then place it on szEmpty and erase it from szGuessMe
                * because memchr returns always the first char it finds.
                *
                * Then increase the nGuessed variable..
                */
               if((ptrCharPos=memchr(&szGuessMe,nKey,strlen(szGuessMe)))!=NULL)
                {
                   nCharPos = ptrCharPos - szGuessMe;
                   nCharsFound++;
                   szEmpty[nCharPos] = szGuessMe[nCharPos];
                   szGuessMe[nCharPos] = 1; /* SOH  */
                }
               else
                   break;
            }

           /* Print what the user guessed until now */
           printf("%s\n",szEmpty);

        }while((nKey=getchar())!='.');

       /* Just to get rid of the Enter key-stroke */
       if(nKey=='.')
           getchar();
    }

   /* End of program ... */
   printf("\nPlease press Enter to exit..");
   getchar();
   
   return 0;
}
/*---------------------------------------------------------------------------*/

 

Υ.Γ.

Ο κώδικας έχει γραφθεί σε CodeGear/Borland C/C++ Builder 6.0 (με το C compliance σε ANSI) και έχει δοκιμασθεί σε περιβάλλον κονσόλας MS-Windows XP (SP2).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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