স্ট্রোককে () কীভাবে স্ট্রিংকে টোকনে বিভক্ত করে?


114

দয়া করে আমাকে strtok()ফাংশনটির কার্যকারিতা ব্যাখ্যা করুন । ম্যানুয়ালটি বলে যে এটি স্ট্রিংটিকে টোকেনে বিভক্ত করে। এটি ম্যানুয়ালটি আসলে কী করে তা আমি বুঝতে অক্ষম।

প্রথমবার যখন লুপটি আসল তখন এর কাজগুলি পরীক্ষা করার জন্য strএবং *pchতার কাজগুলি পরীক্ষা করার জন্য আমি strকেবলমাত্র "এই" এর বিষয়বস্তুগুলি যুক্ত করেছিলাম। নীচে প্রদর্শিত আউটপুট কীভাবে স্ক্রিনে মুদ্রিত হয়েছিল?

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

আউটপুট:

বিভক্ত স্ট্রিং "- এটি, একটি নমুনা স্ট্রিং"। টোকনে:
এই
একটি
নমুনা
দড়ি

5
strtok()ফিরে আসার আগে NUL এর সাথে টোকেন সমাপ্ত করে এর আর্গুমেন্ট স্ট্রিংটি সংশোধন করে। আপনি যদি পুরো বাফারটি পরীক্ষা করার চেষ্টা করেন (str []) আপনি দেখতে পাবেন এটি ক্রমাগত কলগুলির মধ্যে সংশোধিত হচ্ছে strtok()
মাইকেল ফৌকারাকিস

পরিবর্তে দেখার str, ঘড়ি str[0], str[1], str[2], ...
PMG

@ পিএমজি: আমি str [0] এবং str [1] দেখেছি str [1] '\ 0' হওয়া উচিত, তবে এটি সেখানে একটি স্থান ছিল।
ফিউদ্দিন

3
সত্যিই আমি কখনই চেক করতে বিরক্ত করিনি, তবে আমি কল্পনা করি যে এটি শেষ পয়েন্টারটি যে অবস্থানটি রেখেছিল, সেই সাথে এটি পাস করে। তারপরে এটি কেবলমাত্র যদি পয়েন্টারটি নুল হয় তবে চালিয়ে যেতে পারে, বা অবস্থানটি সাফ করুন এবং যদি না হয় তবে শুরু করুন।
ক্রিস

উত্তর:


38

strtok()স্ট্রিংকে টোকনে বিভক্ত করে। উদাহরণস্বরূপ, যেকোন একটি সীমানা থেকে শুরু করে পরেরটি আপনার টোকন হবে। আপনার ক্ষেত্রে, প্রারম্ভিক টোকেনটি "-" থেকে হবে এবং পরবর্তী স্থান "" দিয়ে শেষ হবে। তারপরে পরবর্তী টোকেনটি "" থেকে শুরু হয়ে "," দিয়ে শেষ হবে। এখানে আপনি "এটি" আউটপুট হিসাবে পাবেন। একইভাবে বাকী স্ট্রিংগুলি স্থান থেকে মহাকাশে টোকেনে বিভক্ত হয়ে শেষ অবধি শেষ টোকনটি "এ শেষ করে।"


একটি টোকেনের শেষের অবস্থাটি পরবর্তী টোকেনের সূচনা টোকেন হয়ে ওঠে? এছাড়াও এখানেও কোনও শুল্ক শেষের অবস্থানে রাখা হয়েছে?
ফুদ্দিন

1
@ ফাহাদ- হ্যাঁ, আপনার দ্বারা নির্মিত সমস্ত ডিলিমিটারগুলি NU চরিত্র দ্বারা প্রতিস্থাপন করা হবে যেমন অন্যান্য লোকেরা পরামর্শ দিয়েছে।
শচীন শনভাগ

যদি সমস্ত ডিলিমিটারগুলিকে নুল দ্বারা প্রতিস্থাপন করা হয় তবে স্ট্রিংটিতে "এই "টি থাকে কেন?
এটিতে

2
@ ফাহাদ - এটি কেবলমাত্র সীমানার অক্ষরগুলিকে NUL দিয়ে প্রতিস্থাপন করে, প্রেরকের মধ্যে সমস্ত চরিত্র নয়। এক ধরণের স্ট্রিংকে একাধিক টোকনে বিভক্ত করা। আপনি "এটি" পান কারণ এটি দুটি নির্দিষ্ট সীমানারগুলির মধ্যে এবং "এটি" নয়।
শচীন শনভাগ

1
@ ফাহাদ - হ্যাঁ, একেবারে সমস্ত স্পেস, "," এবং "-" NUL দ্বারা প্রতিস্থাপন করা হয়েছে কারণ আপনি এগুলি যতদূর বুঝতে পেরেছেন হিসাবে এটিকে সীমানা হিসাবে নির্দিষ্ট করেছেন।
শচীন শনভাগ

212

স্ট্রোকক রানটাইম ফাংশন এর মতো কাজ করে

আপনি যখন প্রথম বার স্ট্রোককে ফোন করেন আপনি এমন একটি স্ট্রিং সরবরাহ করেন যা আপনি টোকনাইজ করতে চান

char s[] = "this is a string";

উপরের স্ট্রিং স্পেসে শব্দের মধ্যে একটি ভাল ডিলিমিটার বলে মনে হচ্ছে তাই এটি ব্যবহার করা যাক:

char* p = strtok(s, " ");

এখন যা ঘটে তা হল স্পেস ক্যারেক্টারটি না পাওয়া পর্যন্ত 'গুলি' অনুসন্ধান করা হবে, প্রথম টোকেনটি ফিরে আসবে ('এটি') এবং পি সেই টোকেনের (স্ট্রিং) দিকে নির্দেশ করবে

পরবর্তী টোকেন পেতে এবং একই স্ট্রিংটির সাথে চালিয়ে যাওয়ার জন্য এনআরএল প্রথম আর্গুমেন্ট হিসাবে পাস করা হয়েছে যেহেতু স্ট্রোকক আপনার পূর্ববর্তী পাসের স্ট্রিংটিতে স্থির পয়েন্টারটি বজায় রাখে :

p = strtok(NULL," ");

পি এখন 'হ'ল

এবং এরপরে আর কোনও স্পেস না পাওয়া পর্যন্ত শেষ স্ট্রিংটি শেষ টোকেন 'স্ট্রিং' হিসাবে ফিরে আসে।

আরও স্বাচ্ছন্দ্যে আপনি সমস্ত টোকেন প্রিন্ট করার পরিবর্তে এটি এটি লিখতে পারেন:

for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " "))
{
  puts(p);
}

সম্পাদনা করুন:

আপনি যদি প্রত্যাবর্তিত মানগুলি সংরক্ষণ করতে চান তবে আপনার strtokটোকেনটি অন্য একটি বাফারে অনুলিপি করা উচিত যেমন strdup(p);মূল স্ট্রিংটি (ভিতরে স্থির পয়েন্টার দ্বারা নির্দেশিত strtok) টোকেনটি ফেরত দেওয়ার জন্য পুনরাবৃত্তির মধ্যে পরিবর্তন করা হয়েছে।


সুতরাং এটি আসলে স্ট্রিংয়ের মধ্যে কোনও শূন্য চরিত্র রাখে না? কেন আমার ঘড়িটি দেখায় যে স্ট্রিংটি কেবল "এই" দিয়েই রেখে গেছে?
ফুদ্দিন

4
এটি প্রকৃতপক্ষে '\ 0' এর সাথে পাওয়া '' প্রতিস্থাপন করে। এবং, এটি '' পরে পুনরুদ্ধার করে না, সুতরাং আপনার স্ট্রিং ভালোর জন্য নষ্ট হয়ে গেছে।

33
স্ট্যাটিক বাফারের জন্য +1, এটি আমি বুঝতে পারি নি
আইয়িটবেগলস

1
একটি খুব গুরুত্বপূর্ণ বিস্তারিত, লাইন থেকে অনুপস্থিত "প্রথম টোকেন ফিরিয়ে দেওয়া হয় এবং pযে টোকেন পয়েন্ট" , যে strtokচাহিদা একটি বিভেদক স্থানে একটি নাল অক্ষর স্থাপন দ্বারা মূল স্ট্রিং পরিবর্তন ঘটান করার জন্য (অন্যথায় অন্য স্ট্রিং ফাংশন যেখানে জানতাম না টোকেন শেষ হয়)। এবং এটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করে রাষ্ট্রের উপর নজর রাখে।
Groo

@ গ্রু আমার ধারণা আমি ২০১৩ সালে যে সম্পাদনাটি করেছি তাতে ইতিমধ্যে যুক্ত করেছি তবে আপনি ঠিক বলেছেন right
অ্যান্ডারস্ক

25

strtokস্ট্রিংয়ের পরবর্তী উপলব্ধ টোকেনের দিকে নির্দেশ করে একটি স্থিতিশীল, অভ্যন্তরীণ রেফারেন্স বজায় রাখে; আপনি যদি এটি একটি নল পয়েন্টারটি পাস করেন তবে এটি সেই অভ্যন্তরীণ রেফারেন্স থেকে কাজ করবে।

এই কারণটি strtokপুনরায় প্রবেশকারী নয়; আপনি যখনই এটি একটি নতুন পয়েন্টারটি পাস করবেন, সেই পুরানো অভ্যন্তরীণ রেফারেন্স আঁটসাঁট হয়ে যায়।


পুরানো অভ্যন্তরীণ রেফারেন্সটি 'ক্লোবারড হয়ে যাওয়া' বলতে কী বোঝায়? আপনার অর্থ 'ওভাররাইটন'?
ylun.ca

1
@ ylun.ca: হ্যাঁ, এটাই আমার অর্থ।
জন বোদে

10

strtokপ্যারামিটারটি নিজেই পরিবর্তন করে না ( str)। এটি সেই পয়েন্টারটি সঞ্চয় করে (স্থানীয় স্ট্যাটিক ভেরিয়েবলে)। এটি পরে প্যারামিটারটি ফিরে না পেয়ে পরবর্তী কলগুলিতে সেই পরামিতিটি কী নির্দেশ করে তা পরিবর্তন করতে পারে । (এবং এটি যে পয়েন্টারটি রেখেছিল তা এগিয়ে যেতে পারে তবে এটির কাজগুলি চালানো দরকার))

পসিক্স strtokপৃষ্ঠা থেকে:

এই ফাংশনটি কলগুলির মধ্যে বর্তমান স্ট্রিং অবস্থানের উপর নজর রাখতে স্ট্যাটিক স্টোরেজ ব্যবহার করে।

একটি থ্রেড-নিরাপদ বৈকল্পিক ( strtok_r) রয়েছে যা এই ধরণের যাদু করে না।


2
ঠিক আছে, সি লাইব্রেরি ফাংশন থেকে ফেরার সময় থেকেই কাজ করে, থ্রেডিং মোটেও ছবিতে ছিল না (এটি কেবলমাত্র সি মানক সম্পর্কিত ২০১১ সালে বিদ্যমান ছিল), সুতরাং পুনরায় প্রবেশের ব্যবস্থাটি গুরুত্বপূর্ণ ছিল না ( আমি অনুমান করি). স্থিতিশীল স্থানীয় এই ফাংশনটিকে "ব্যবহার করা সহজ" করে তোলে ("সহজ" এর কিছু সংজ্ঞার জন্য)। ctimeস্ট্যাটিক স্ট্রিং ফিরিয়ে দেওয়ার মতো - ব্যবহারিক (কারও এটিকে মুক্ত করা উচিত তা ভাববার দরকার নেই) তবে পুনরায় প্রবেশকারী নয় এবং আপনি যদি খুব সচেতন না হন তবে আপনাকে ট্রিপ করে না।
মাদুর

এটি ভুল: " strtokপ্যারামিটারটি নিজে পরিবর্তন করে না ( str)।" puts(str);মুদ্রণগুলি "- এটি" strtokপরিবর্তিত হওয়ার পরে str
মাররেডচিজ

1
@ মাররেডচিজ: আবার পড়ুন। এটি পয়েন্টারটি পরিবর্তন করে না। এটি পয়েন্টারটি নির্দেশ করে এমন ডেটা পরিবর্তন করে (যেমন স্ট্রিং ডেটা)
মাদুর

ওহ ঠিক আছে, আমি বুঝতে পারিনি যে আপনি যা করছেন। একমত।
মারেডচিজ

8

প্রথমবার যখন আপনি এটি কল করবেন, আপনি টোকনাইজ করার জন্য স্ট্রিং সরবরাহ করবেন strtok। এবং তারপরে, নিম্নলিখিত টোকেনগুলি পেতে, আপনি কেবলমাত্র NULLসেই ফাংশনটি দেবেন, যতক্ষণ না এটি কোনও NULLপয়েন্টার না দেয়।

strtokফাংশন স্ট্রিং আপনাকে প্রথমে প্রদত্ত যখন আপনি এটি কল রেকর্ড। (মাল্টি-থ্রেড অ্যাপ্লিকেশনগুলির জন্য যা সত্যই বিপজ্জনক)


8

স্ট্রোকোক একটি স্ট্রিংকে টোকানাইজ করবে অর্থাৎ এটিকে সাবস্ট্রিংয়ের একটি সিরিজে রূপান্তর করবে।

এটি এমন ডিলিমিটারদের অনুসন্ধান করে যা এই টোকেনগুলি (বা সাবস্ট্রিংগুলি) পৃথক করে। এবং আপনি সীমানা নির্দিষ্ট করে দিন। আপনার ক্ষেত্রে, আপনি '' বা ',' বা 'চান। বা '-' সীমাবদ্ধ করতে হবে।

এই টোকেনগুলি এক্সট্রাক্ট করার প্রোগ্রামিং মডেলটি হ'ল আপনি আপনার মূল স্ট্রিং এবং ডিলিমেটারগুলির সেটটি স্ট্রোক করেন। তারপরে আপনি এটিকে বারবার কল করবেন এবং প্রতিবার স্ট্রটোক তার পরবর্তী টোকেনটি সন্ধান করবে। যতক্ষণ না এটি মূল স্ট্রিংয়ের শেষে পৌঁছায়, যখন এটি শূন্য হয়। আর একটি নিয়ম হ'ল আপনি প্রথম বারের মধ্যেই স্ট্রিংটি পাস করেন এবং পরবর্তী সময়ের জন্য NULL। আপনি যদি নতুন স্ট্রিং দিয়ে টোকেনাইজেশনের নতুন অধিবেশন শুরু করছেন বা আপনি আগের টোকেনাইজিং সেশন থেকে টোকেনগুলি পুনরুদ্ধার করছেন তবে স্ট্রটোককে বলার এই উপায়। নোট করুন যে স্ট্রোকক টোকেনাইজিং সেশনের জন্য তার অবস্থার কথা মনে রাখে। এবং এই কারণে এটি তদন্তকারী বা থ্রেড নিরাপদ নয় (পরিবর্তে আপনার strtok_r ব্যবহার করা উচিত)। আরও একটি বিষয় জানতে হবে এটি আসলে মূল স্ট্রিংটি সংশোধন করে। এটি যে সীমানা খুঁজে পেয়েছে তার জন্য এটি '\ 0' লিখেছেন।

দৃto়ভাবে, স্ট্রোককে আহ্বান করার একটি উপায় নিম্নরূপ:

char str[] = "this, is the string - I want to parse";
char delim[] = " ,-";
char* token;

for (token = strtok(str, delim); token; token = strtok(NULL, delim))
{
    printf("token=%s\n", token);
}

ফলাফল:

this
is
the
string
I
want
to
parse

5

strtok এর ইনপুট স্ট্রিংটি পরিবর্তন করে। এটি এতে নাল অক্ষর ('\ 0') রাখে যাতে এটি মূল স্ট্রিংয়ের বিটগুলি টোকেন হিসাবে ফিরিয়ে দেয়। আসলে স্ট্রটোক মেমরি বরাদ্দ করে না। আপনি বাক্সগুলির ক্রম হিসাবে স্ট্রিংটি আঁকলে আপনি এটি আরও ভাল বুঝতে পারবেন।


3

কীভাবে strtok()কাজ করে তা বোঝার জন্য প্রথমে স্ট্যাটিক ভেরিয়েবল কী তা জানতে হবে। এই লিঙ্কটি এটি বেশ ভাল ব্যাখ্যা করে ....

অপারেশনের মূল চাবিকাঠিটি strtok()স্যাকসেসিভ কলগুলির মধ্যে সর্বশেষ বিভাগের অবস্থান সংরক্ষণ করা হয় (একারণে strtok()যখন null pointerকলগুলির সাথে যুক্ত হয় তখন এটি প্রেরণ করা হয় এমন আসল স্ট্রিংটিকে বিশ্লেষণ করে চলেছে ) ..

strtok()বলা হয় আমার নিজস্ব বাস্তবায়নের দিকে নজর দিন zStrtok(), যার সরবরাহকৃতের চেয়ে কিছুটা আলাদা কার্যকারিতা রয়েছেstrtok()

char *zStrtok(char *str, const char *delim) {
    static char *static_str=0;      /* var to store last address */
    int index=0, strlength=0;           /* integers for indexes */
    int found = 0;                  /* check if delim is found */

    /* delimiter cannot be NULL
    * if no more char left, return NULL as well
    */
    if (delim==0 || (str == 0 && static_str == 0))
        return 0;

    if (str == 0)
        str = static_str;

    /* get length of string */
    while(str[strlength])
        strlength++;

    /* find the first occurance of delim */
    for (index=0;index<strlength;index++)
        if (str[index]==delim[0]) {
            found=1;
            break;
        }

    /* if delim is not contained in str, return str */
    if (!found) {
        static_str = 0;
        return str;
    }

    /* check for consecutive delimiters
    *if first char is delim, return delim
    */
    if (str[0]==delim[0]) {
        static_str = (str + 1);
        return (char *)delim;
    }

    /* terminate the string
    * this assignmetn requires char[], so str has to
    * be char[] rather than *char
    */
    str[index] = '\0';

    /* save the rest of the string */
    if ((str + index + 1)!=0)
        static_str = (str + index + 1);
    else
        static_str = 0;

        return str;
}

এবং এখানে একটি উদাহরণ ব্যবহার

  Example Usage
      char str[] = "A,B,,,C";
      printf("1 %s\n",zStrtok(s,","));
      printf("2 %s\n",zStrtok(NULL,","));
      printf("3 %s\n",zStrtok(NULL,","));
      printf("4 %s\n",zStrtok(NULL,","));
      printf("5 %s\n",zStrtok(NULL,","));
      printf("6 %s\n",zStrtok(NULL,","));

  Example Output
      1 A
      2 B
      3 ,
      4 ,
      5 C
      6 (null)

কোডটি একটি স্ট্রিং প্রসেসিং লাইব্রেরি থেকে আমি গিথুবে রক্ষণ করি , যাকে জেডস্ট্রিং বলে। কোডটি দেখুন বা অবদান রাখুন :) https://github.com/fnoyanisi/zString


3

এইভাবেই আমি স্ট্রটোক বাস্তবায়িত করেছি, এটি দুর্দান্ত নয় তবে এটিতে 2 ঘন্টা কাজ করার পরে অবশেষে এটি কাজ করে। এটি একাধিক সীমানা সরবরাহকারীকে সমর্থন করে।

#include "stdafx.h"
#include <iostream>
using namespace std;

char* mystrtok(char str[],char filter[]) 
{
    if(filter == NULL) {
        return str;
    }
    static char *ptr = str;
    static int flag = 0;
    if(flag == 1) {
        return NULL;
    }
    char* ptrReturn = ptr;
    for(int j = 0; ptr != '\0'; j++) {
        for(int i=0 ; filter[i] != '\0' ; i++) {
            if(ptr[j] == '\0') {
                flag = 1;
                return ptrReturn;
            }
            if( ptr[j] == filter[i]) {
                ptr[j] = '\0';
                ptr+=j+1;
                return ptrReturn;
            }
        }
    }
    return NULL;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char str[200] = "This,is my,string.test";
    char *ppt = mystrtok(str,", .");
    while(ppt != NULL ) {
        cout<< ppt << endl;
        ppt = mystrtok(NULL,", ."); 
    }
    return 0;
}


1

এখানে আমার বাস্তবায়ন যা ডিলিমিটারের জন্য হ্যাশ টেবিল ব্যবহার করে, যার অর্থ এটি ও (এন instead 2) এর পরিবর্তে ও (এন) (কোডের একটি লিঙ্ক এখানে) :

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

#define DICT_LEN 256

int *create_delim_dict(char *delim)
{
    int *d = (int*)malloc(sizeof(int)*DICT_LEN);
    memset((void*)d, 0, sizeof(int)*DICT_LEN);

    int i;
    for(i=0; i< strlen(delim); i++) {
        d[delim[i]] = 1;
    }
    return d;
}



char *my_strtok(char *str, char *delim)
{

    static char *last, *to_free;
    int *deli_dict = create_delim_dict(delim);

    if(!deli_dict) {
        /*this check if we allocate and fail the second time with entering this function */
        if(to_free) {
            free(to_free);
        }
        return NULL;
    }

    if(str) {
        last = (char*)malloc(strlen(str)+1);
        if(!last) {
            free(deli_dict);
            return NULL;
        }
        to_free = last;
        strcpy(last, str);
    }

    while(deli_dict[*last] && *last != '\0') {
        last++;
    }
    str = last;
    if(*last == '\0') {
        free(deli_dict);
        free(to_free);
        deli_dict = NULL;
        to_free = NULL;
        return NULL;
    }
    while (*last != '\0' && !deli_dict[*last]) {
        last++;
    }

    *last = '\0';
    last++;

    free(deli_dict);
    return str;
}

int main()
{
    char * str = "- This, a sample string.";
    char *del = " ,.-";
    char *s = my_strtok(str, del);
    while(s) {
        printf("%s\n", s);
        s = my_strtok(NULL, del);
    }
    return 0;
}

1

স্ট্রোটোক () পয়েন্টারটি স্থিতিশীল ভেরিয়েবলে সংরক্ষণ করে যেখানে আপনি শেষ বার ছেড়ে গিয়েছিলেন, সুতরাং এর দ্বিতীয় কলটিতে, আমরা যখন নালটি পাস করি, স্ট্রোটোক () স্ট্যাটিক ভেরিয়েবল থেকে পয়েন্টার পায়।

আপনি যদি একই স্ট্রিংয়ের নাম সরবরাহ করেন তবে এটি আবার শুরু থেকে শুরু হয়।

তবুও স্ট্র্টোক () ধ্বংসাত্মক অর্থাৎ এটি অরিগনাল স্ট্রিংয়ে পরিবর্তন করে। সুতরাং নিশ্চিত হন যে আপনার কাছে সর্বদা অরিজেনালের একটি অনুলিপি রয়েছে।

স্ট্রটোক () ব্যবহারের আরও একটি সমস্যা হ'ল এটি স্থিতিশীল ভেরিয়েবলগুলিতে ঠিকানা সঞ্চয় করার সাথে সাথে মাল্ট্রিথ্রেডেড প্রোগ্রামিংয়ে স্ট্র্টোক () কল করে একাধিকবার ত্রুটি ঘটায়। এর জন্য strtok_r () ব্যবহার করুন।


0

যারা এখনও এই strtok()ফাংশনটি বুঝতে খুব অসুবিধা বোধ করছেন তাদের জন্য এই পাইথনস্টোর উদাহরণটি দেখুন , এটি আপনার সি (বা সি ++, পাইথন ...) কোডটি ভিজ্যুয়ালাইজ করা দুর্দান্ত সরঞ্জাম।

লিঙ্কটি নষ্ট হয়ে গেলে, এতে পেস্ট করুন:

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

int main()
{
    char s[] = "Hello, my name is? Matthew! Hey.";
    char* p;
    for (char *p = strtok(s," ,?!."); p != NULL; p = strtok(NULL, " ,?!.")) {
      puts(p);
    }
    return 0;
}

ক্রেডিট অ্যান্ডারস কে।


0

টোকেনটির সন্ধানে আপনি চর অ্যারেটি স্ক্যান করতে পারেন যদি আপনি এটির জন্য নতুন লাইন প্রিন্ট করেন তবে অন্যটি মুদ্রণ করুন।

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

int main()
{
    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);
    s = realloc(s, strlen(s) + 1);
    int len = strlen(s);
    char delim =' ';
    for(int i = 0; i < len; i++) {
        if(s[i] == delim) {
            printf("\n");
        }
        else {
            printf("%c", s[i]);
        }
    }
    free(s);
    return 0;
}

0

সুতরাং, এই বিষয়টিকে আরও ভালভাবে বুঝতে সহায়তা করার জন্য এটি একটি কোড স্নিপেট।

মুদ্রণ টোকেন

কার্য: একটি বাক্য দেওয়া, গুলি, বাক্যটির প্রতিটি শব্দ একটি নতুন লাইনে মুদ্রণ করুন।

char *s;
s = malloc(1024 * sizeof(char));
scanf("%[^\n]", s);
s = realloc(s, strlen(s) + 1);
//logic to print the tokens of the sentence.
for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " "))
{
    printf("%s\n",p);
}

ইনপুট: How is that

ফলাফল:

How
is
that

ব্যাখ্যা: সুতরাং এখানে, "স্ট্রটোক ()" ফাংশন ব্যবহৃত হয় এবং এটি লুপের সাহায্যে পৃথক লাইনে টোকেনগুলি প্রিন্ট করতে পুনরাবৃত্তি হয়।

ফাংশনটি 'স্ট্রিং' এবং 'ব্রেক-পয়েন্ট' হিসাবে পরামিতি নেবে এবং সেই ব্রেক-পয়েন্টগুলিতে স্ট্রিংটি ভেঙে টোকেন ফর্ম করবে। এখন, এই টোকেনগুলি 'p' এ সংরক্ষণ করা হয় এবং প্রিন্টিংয়ের জন্য আরও ব্যবহৃত হয়।


আমি মনে করি যে কোনও দস্তকের উল্লেখের চেয়ে উদাহরণের মাধ্যমে ব্যাখ্যা করা আরও ভাল।
tr_abhishek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.