मैं फंक्शन बनाने की कोशिश कर रहा था, जो एक तर्क के रूप में एक स्ट्रिंग के रूप में लेता है, इसे स्ट्रिंग्स में विभाजित करता है, जहां शब्दों को रिक्त स्थान से अलग किया जाता है, इसे एक सरणी में सहेजें और पॉइंटर के माध्यम से इसे लौटाता है। स्मृति के स्थैतिक आवंटन के बावजूद, विभाजन की गलती के कारण, व्हिच एड्रेस लिया गया, प्रोग्राम क्रैश हो गया। इस कोड के साथ क्या समस्या है?

void separate_words(char* full_text, char *matrix[], int* how_many)
{
char tmp;
int actual_letter,which_letter=0;
for(actual_letter=0;actual_letter<strlen(full_text);actual_letter++)
{
    if(full_text[actual_letter]!=32)
{


    full_text[actual_letter];
    matrix[*how_many][whitch_letter]=full_text[actual_letter];//here crashes
}
else
{  
    *how_many++;
    which_letter=0;
}
}

//*how_many
}

/*...*/
char words[20][20];
char text[20];
int number_of_words=0;
separate_words(text,words,&number_of_words);
2
Hassan 14 नवम्बर 2015, 05:00

2 जवाब

सबसे बढ़िया उत्तर

यह एक विशिष्ट समस्या है जब आप strtok का उपयोग कर सकते हैं

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

void separate_words(char* full_text, char *matrix[], int* how_many)
{
    char *pch;
    pch = strtok (full_text," \t\n");
    int i = 0;
    while (pch != NULL)
    {
        matrix[i++] = pch;
        pch = strtok (NULL, " \t\n");
    }
    *how_many = i;
}

int main ()
{
    char str[] = "apple   banana orange pineapple";
    char *matrix[100] = { NULL };
    int how_many = 0;
    separate_words(str, matrix, &how_many);

    int i;
    for( i = 0; i < how_many; i++ )
    {
        if( matrix[i] != NULL )
        {
            printf( "matrix[%d] = %s\n", i, matrix[i] );
        }
    }
    return 0;
}

आउटपुट:

matrix[0] = apple
matrix[1] = banana
matrix[2] = orange
matrix[3] = pineapple
1
artm 14 नवम्बर 2015, 02:11

फ़ंक्शन को स्ट्रिंग में अलग करने के लिए फ़ंक्शन के पैरामीटर के रूप में strtok के साथ उपयोग करने के लिए अक्सर सीमांकक पास करना उपयोगी होता है। आप कुछ परिस्थितियों में कोड को साफ करने के लिए strtok के साथ for लूप का उपयोग भी कर सकते हैं।

चूँकि परिणामस्वरूप सरणी को सौंपे गए बिंदुओं की संख्या कभी भी नकारात्मक नहीं हो सकती है, size_t या unsigned डेटा प्रकार का विकल्प कंपाइलर बिंदु की मदद कर सकता है यदि चर बाद में अनुचित तरीके से उपयोग किया जाता है।

अंत में, यदि प्रत्येक टोकन के लिए पॉइंटर्स को रखने के लिए पॉइंटर्स के स्थिर आकार के सरणी का उपयोग करना है, तो असाइन किए गए पॉइंटर्स की संख्या का परीक्षण करना महत्वपूर्ण है, ताकि आपके एरे के अंत से परे लेखन को रोका जा सके। ध्यान दें: यदि आप गतिशील रूप से malloc या calloc के साथ संकेत आवंटित करते हैं, तो आप realloc कॉल कर सकते हैं जब आपकी प्रारंभिक सीमा समाप्त हो जाती है, और बाद में, आवश्यकतानुसार।

विभिन्न टुकड़ों को एक साथ रखना, एक विकल्प होगा:

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

#define MAXP 100

void separate_words (char *a[], char *s, char *delim, size_t *n);

int main (void)
{
    char str[] = "apple  banana orange pineapple";
    char *delim = " \t\n";
    char *matrix[MAXP] = { NULL };
    size_t how_many = 0;
    size_t i;

    separate_words (matrix, str, delim, &how_many);

    for (i = 0; i < how_many; i++)
        printf ("matrix[%zu] = %s\n", i, matrix[i]);

    return 0;
}

/* separate 's' into tokens based on delimiters provided in 'delim'
 * with pointers to each token saved in 'a' with 'n' updated to hold
 * the number of pointers contained in 'a'.
 */ 
void separate_words (char *a[], char *s, char *delim, size_t *n)
{
    *n = 0;
    char *p = strtok (s, delim);
    for (; p; p = strtok (NULL, delim)) {
        a[(*n)++] = p;
        if (*n == MAXP) {
            fprintf (stderr, "warning: pointer limit reached.\n");
            return;
        }
    }
}

आउटपुट

$ ./bin/strtok_static
matrix[0] = apple
matrix[1] = banana
matrix[2] = orange
matrix[3] = pineapple

रिटर्न का उपयोग करना

इसके अतिरिक्त, आप स्ट्रिंग में टोकन की संख्या वापस करने के लिए फ़ंक्शन रिटर्न का उपयोग कर सकते हैं। यह फ़ंक्शन के पैरामीटर के रूप में पॉइंटर चर को पास करने की आवश्यकता को समाप्त करता है:

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

#define MAXP 100

size_t separate_words (char *a[], char *s, char *delim);

int main (void)
{
    char str[] = "apple  banana orange pineapple";
    char *delim = " \t\n";
    char *matrix[MAXP] = { NULL };
    size_t how_many = 0;
    size_t i;

    how_many = separate_words (matrix, str, delim);

    for (i = 0; i < how_many; i++)
        printf ("matrix[%zu] = %s\n", i, matrix[i]);

    return 0;
}

/* separate 's' into tokens based on delimiters provided in 'delim'
 * with pointers to each token saved in 'a'. The number of tokens is
 * returned.
 */ 
size_t separate_words (char *a[], char *s, char *delim)
{
    size_t n = 0;
    char *p = strtok (s, delim);
    for (; p; p = strtok (NULL, delim)) {
        a[n++] = p;
        if (n == MAXP) {
            fprintf (stderr, "warning: pointer limit reached.\n");
            break;
        }
    }
    return n;
}
0
David C. Rankin 14 नवम्बर 2015, 10:11