2010-02-15 18 views
6

मैं strtok() के साथ फ़ाइल में शब्दों की संख्या गिनने की कोशिश कर रहा हूं।अप्रत्याशित strtok() व्यवहार

/* 
* code.c 
* 
* WHAT 
*  Use strtok() to count the number of words in a file. 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define STRMAX 128 

int main() { 
    /* Declarations */ 
    FILE* fptr; 
    int iCntr = 0; 
    char sLine[STRMAX]; 
    char* cPToken; 

    /* Read file */ 
    /* Error handler */ 
    if ((fptr = fopen("/home/ubuntu/Dropbox/Unief/C/H18/Opdr01/Debug/test.txt", "r")) == NULL) { 
     printf("Couldn't read test.txt.\n"); 
     exit(0); 
    } else { 
     while (fgets(sLine, STRMAX-1, fptr) != NULL) {     /* Read line */ 
      while ((cPToken = strtok(sLine, ".,; !?\r\n")) != NULL) { /* Split into words */ 
       iCntr++; 
      } 
     } 
     printf("Number of words: %d\n", iCntr); 
    } 

    /* Always clean up your mess */ 
    fclose(fptr); 
    return 0; 
} 

यह एक अनंत लूप का कारण बनता है। क्यूं कर?

+0

माध्यम से उपयोग करने के 'fgets (sLine, STRMAX, fptr)' 'नहीं STRMAX-1' – user102008

उत्तर

8

आपको दो कॉल की आवश्यकता है, दूसरी बार आपको NULL को strtok पर पास करने की आवश्यकता है।

बजाय:

while ((cPToken = strtok(sLine, ".,; !?\r\n")) != NULL) { /* Split into words */ 
       iCntr++; 
} 

कर

cPToken = strtok(sLine, ".,; !?\r\n"); 
while (cPToken != NULL) { /* Split into words */ 
    iCntr++; /* we have a valid word */ 
    cPToken = strtok(NULL, ".,; !?\r\n");   
} 

संपादित करें: पूर्ण स्रोत:

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

size_t wcount(const char *fname, const char *delim) { 
    char buf[ 512 ]; 
    size_t nw = 0; 
    FILE *fp = fopen(fname, "r"); 
    if (fp) { 
     while (fgets(buf, sizeof buf, fp) != NULL) { 
      for (char *w = strtok(buf, delim); w; w = strtok(NULL, delim)) 
       nw++; 
     } 
     fclose(fp); 
    } 
    return nw; 
} 

int main(int argc, char* argv[]) 
{ 
    printf("%u\n", wcount("C:\\sample.txt", ".,; !?\r\n")); 
    return 0; 
} 

अपने इनपुट फ़ाइल के साथ, मैं 16

के रूप में परिणाम प्राप्त # 2 संपादित करें: अपने स्रोत को संशोधित करना:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define STRMAX 128 

int main() { 
    /* Declarations */ 
    FILE* fptr; 
    int iCntr = 0; 
    char sLine[STRMAX]; 
    char* cPToken; 

    /* Read file */ 
    /* Error handler */ 
    if ((fptr = fopen("c:\\test.txt", "r")) == NULL) { 
     printf("Couldn't read test.txt.\n"); 
     exit(0); 
    } else { 
     while (fgets(sLine, STRMAX-1, fptr) != NULL) {     /* Read line */ 
      cPToken = strtok(sLine, ".,; !?\r\n"); 
      while (cPToken != NULL) { /* Split into words */ 
       iCntr++; 
       cPToken = strtok(NULL, ".,; !?\r\n"); 
      } 
     } 
     printf("Number of words: %d\n", iCntr); 
    } 

    /* Always clean up your mess */ 
    fclose(fptr); 
    return 0; 
} 

मैं एक ही परिणाम प्राप्त - 16.

+0

सही रूप में शब्दों की संख्या का प्रतिनिधित्व नहीं करता है कि जहां तक ​​मैं कह सकता हूं, मेरी टेक्स्ट फ़ाइल में। – Pieter

+1

@ पीटर: आपको दूसरी बार 'स्ट्रोकोक' कॉल करने की आवश्यकता है। यह ऐसे काम करता है। और पहला पैरामीटर दूसरे कॉल के लिए 'NULL' होना चाहिए (जिसे आमतौर पर लूप में लपेटा जाता है)। आपको काउंटर वृद्धि को पुनर्व्यवस्थित करने की आवश्यकता हो सकती है। मेरे द्वारा पोस्ट किया गया कोड यह दिखाने के लिए था कि केवल 'स्ट्रोक' को कैसे कॉल करें। – dirkgently

+0

@Pieter "जहां तक ​​मैं कह सकता हूं" थोड़ा अस्पष्ट प्रतिक्रिया है, एक ज्ञात शब्द गणना के साथ एक टेक्स्ट फ़ाइल के साथ प्रयास करें और गीलेर को सत्यापित करने के लिए इसका उपयोग करें या समाधान काम नहीं करता है। –

संबंधित मुद्दे