खोज…


एक धारा से पढ़े हुए पात्रों को वर्गीकृत करना

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

typedef struct {
  size_t space;
  size_t alnum;
  size_t punct;
} chartypes;

chartypes classify(FILE *f) {
  chartypes types = { 0, 0, 0 };
  int ch;

  while ((ch = fgetc(f)) != EOF) {
    types.space += !!isspace(ch);
    types.alnum += !!isalnum(ch);
    types.punct += !!ispunct(ch);
  }

  return types;
}

classify फ़ंक्शन एक धारा से वर्ण पढ़ता है और रिक्त स्थान, अल्फ़ान्यूमेरिक और विराम चिह्नों की संख्या को गिनता है। यह कई नुकसान से बचा जाता है।

  • एक धारा से एक चरित्र को पढ़ते समय, परिणाम को एक int रूप में सहेजा जाता है, क्योंकि अन्यथा EOF (अंत-से-फ़ाइल मार्कर) पढ़ने के बीच एक अस्पष्टता होगी और एक चरित्र जिसमें समान पैटर्न होता है।
  • चरित्र वर्गीकरण फ़ंक्शंस (जैसे isspace ) उनके तर्क को एक unsigned char या EOF मैक्रो के मूल्य के रूप में प्रतिनिधित्व करने योग्य होने की उम्मीद करते हैं । चूँकि यह ठीक वैसा ही है जैसा कि fgetc देता है, यहाँ रूपांतरण की कोई आवश्यकता नहीं है।
  • वर्ण वर्गीकरण फ़ंक्शंस का रिटर्न वैल्यू केवल शून्य (अर्थ false ) और नॉनज़रो ( true अर्थ) के बीच अंतर करता है। घटनाओं की संख्या की गणना के लिए, इस मान को 1 या 0 में परिवर्तित करने की आवश्यकता है, जो कि दोहरे निषेध द्वारा किया जाता है, !!

एक तार से वर्णों को वर्गीकृत करना

#include <ctype.h>
#include <stddef.h>

typedef struct {
  size_t space;
  size_t alnum;
  size_t punct;
} chartypes;

chartypes classify(const char *s) {
  chartypes types = { 0, 0, 0 };
  const char *p;
  for (p= s; p != '\0'; p++) {
    types.space += !!isspace((unsigned char)*p);
    types.alnum += !!isalnum((unsigned char)*p);
    types.punct += !!ispunct((unsigned char)*p);
  }

  return types;
}

classify फ़ंक्शन एक स्ट्रिंग से सभी वर्णों की जांच करता है और रिक्त स्थान, अल्फ़ान्यूमेरिक और विराम चिह्नों की संख्या की गणना करता है। यह कई नुकसान से बचा जाता है।

  • चरित्र वर्गीकरण फ़ंक्शंस (जैसे isspace ) उनके तर्क को एक unsigned char या EOF मैक्रो के मूल्य के रूप में प्रतिनिधित्व करने योग्य होने की उम्मीद करते हैं
  • अभिव्यक्ति *p प्रकार char और इसलिए इसे उपरोक्त शब्दों से मिलान करने के लिए परिवर्तित किया जाना चाहिए।
  • char प्रकार को signed char या unsigned char बराबर माना जाता है।
  • जब char unsigned char बराबर होता है, तो कोई समस्या नहीं है, क्योंकि char प्रकार के हर संभव मूल्य को unsigned char रूप में दर्शाया जा सकता है।
  • जब char पर signed char बराबर होता है, तो उसे वर्ण वर्गीकरण कार्यों में पारित होने से पहले unsigned char परिवर्तित किया जाना चाहिए। और यद्यपि इस रूपांतरण के कारण चरित्र का मूल्य बदल सकता है, यह वही है जो इन कार्यों की अपेक्षा करता है।
  • वर्ण वर्गीकरण फ़ंक्शंस का रिटर्न वैल्यू केवल शून्य (अर्थ false ) और नॉनज़रो ( true अर्थ) के बीच अंतर करता है। घटनाओं की संख्या की गणना के लिए, इस मान को 1 या 0 में परिवर्तित करने की आवश्यकता है, जो कि दोहरे निषेध द्वारा किया जाता है, !!

परिचय

शीर्ष लेख ctype.h मानक C लाइब्रेरी का एक हिस्सा है। यह वर्णों को वर्गीकृत और परिवर्तित करने के लिए कार्य प्रदान करता है।

ये सभी कार्य एक पैरामीटर लेते हैं, एक ऐसा int जो किसी ईओएफ के रूप में ईओएफ या प्रतिनिधित्व करने योग्य होना चाहिए।

वर्गीकरण कार्यों के नाम। है ’के साथ उपसर्ग हैं। प्रत्येक पूर्णांक गैर-शून्य मान (TRUE) लौटाता है यदि इसमें दिया गया वर्ण संबंधित स्थिति को संतुष्ट करता है। यदि हालत संतुष्ट नहीं है, तो फ़ंक्शन शून्य मान (FALSE) देता है।

डिफ़ॉल्ट सी लोकेल मानकर ये वर्गीकरण कार्य दिखाए गए हैं:

int a;
int c = 'A';
a = isalpha(c); /* Checks if c is alphabetic (A-Z, a-z), returns non-zero here. */
a = isalnum(c); /* Checks if c  is alphanumeric (A-Z, a-z, 0-9), returns non-zero here. */
a = iscntrl(c); /* Checks is c is a control character (0x00-0x1F, 0x7F), returns zero here. */
a = isdigit(c); /* Checks if c is a digit (0-9), returns zero here. */
a = isgraph(c); /* Checks if c has a graphical representation (any printing character except space), returns non-zero here. */
a = islower(c); /* Checks if c is a lower-case letter (a-z), returns zero here. */
a = isprint(c); /* Checks if c is any printable character (including space), returns non-zero here. */
a = isupper(c); /* Checks if c is a upper-case letter (a-z), returns zero here. */
a = ispunct(c); /* Checks if c is a punctuation character, returns zero here. */
a = isspace(c); /* Checks if c is a white-space character, returns zero here. */
a = isupper(c); /* Checks if c is an upper-case letter (A-Z), returns non-zero here. */
a = isxdigit(c); /* Checks if c is a hexadecimal digit (A-F, a-f, 0-9), returns non-zero here. */
C99
a = isblank(c); /* Checks if c is a blank character (space or tab), returns non-zero here. */

दो रूपांतरण कार्य हैं। इनका नाम उपसर्ग 'से' तक रखा गया है। ये कार्य ऊपर दिए गए लोगों के समान ही तर्क देते हैं। हालाँकि वापसी मूल्य एक साधारण शून्य या गैर-शून्य नहीं है लेकिन पारित तर्क कुछ तरीके से बदल गया है।

ये रूपांतरण फ़ंक्शन डिफ़ॉल्ट सी लोकेल को मानते हुए दिखाए गए अनुसार काम करते हैं:

int a;
int c = 'A';

/* Converts c to a lower-case letter (a-z). 
 * If conversion is not possible the unchanged value is returned. 
 * Returns 'a' here. 
 */
a = tolower(c);

/* Converts c to an upper-case letter (A-Z). 
 * If conversion is not possible the unchanged value is returned. 
 * Returns 'A' here. 
 */
a = toupper(c);

नीचे दी गई जानकारी cplusplus.com मैपिंग से उद्धृत की गई है कि मूल 127-वर्ण ASCII सेट को प्रत्येक वर्गीकृत प्रकार के कार्यों द्वारा कैसे माना जाता है (एक • इंगित करता है कि फ़ंक्शन उस चरित्र के लिए गैर-शून्य देता है)

ASCII मान पात्र iscntrl खाली है isspace isupper कम है isalpha isdigit isxdigit isalnum ispunct isgraph isprint
0x00 .. 0x08 एनयूएल, (अन्य नियंत्रण कोड)
0x09 टैब ('\ t')
0x0A .. 0x0D (व्हाइट-स्पेस कंट्रोल कोड: '\ f', '\ v', '\ n', '\ r')
0x0E .. 0x1F (अन्य नियंत्रण कोड)
0x20 अंतरिक्ष ('')
0x21 .. 0x2F ! "# $% & '() * +, -। /
0x30 .. 0x39 0123456789
0x3a .. 0x40 :;? <=> @
0x41 .. 0x46 ABCDEF
0x47 .. 0x5A GHIJKLMNOPQRSTUVWXYZ
0x5B .. 0x60 [] ^ _ `
0x61 .. 0x66 abcdef
0x67 .. 0x7A ghijklmnopqrstuvwxyz
0x7B .. 0x7E {} ~ बार
0x7F (डेल)


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow