تفکیک رشته در زبان c - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تفکیک رشته در زبان c

0 امتیاز
سلام من میخوام یک ورودی بگیرم که شامل چنتا کلمه اس که اسپیس اونا رو از هم جدا میکنه. میخوام که اون هایی که با اسپیس جدا شدند رو هرکدوم داخل یک آرایه دیگه بریزم. کسی میتونه کمکم کنه؟

با تشکر از همه دوستان
سوال شده اردیبهشت 15, 1399  بوسیله ی SICARIO (امتیاز 29)   2 7 9

2 پاسخ

+1 امتیاز

سلام؛ می‌تونید از تابع ()strtok استفاده کنید :

int main(void)
{
    char str[] = "ghasem ramezani manesh";
    char* chunk = NULL;

    chunk = strtok(str, " ");

    while (chunk)
    {
        puts(chunk);
        chunk = strtok(NULL, " ");
    }
}

 

پاسخ داده شده اردیبهشت 17, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
فکر کنم سوال دانشجویی طرف ، گیر خود تابع strtok .چی درس میدن و اینا کجا رو میخونن
خب برای یادگیری زبان سی، نیاز به کتاب The GNU C programming language و کتاب The GNU C manual دارند.
0 امتیاز

پاسخ @mg_ramezani درسته این هم با جزئیات بیشتر.

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

char* my_strtok(char* s, char* delm)
{
    static int currIndex = 0;
    if(!s || !delm || s[currIndex] == '\0')
    return NULL;
    char *W = (char *)malloc(sizeof(char)*100);
    int i = currIndex, k = 0, j = 0;

    while (s[i] != '\0'){
        j = 0;
        while (delm[j] != '\0'){
            if (s[i] != delm[j])
                W[k] = s[i];
            else goto It;
            j++;
        }

        i++;
        k++;
    }
It:
    W[i] = 0;
    currIndex = i+1;
    //Iterator = ++ptr;
    return W;
}

int main(void)
{
    char s[100] = "Arash Aydi pour";
    char delm[] = " ";
    //char newstr[100];
    char *str = my_strtok(s, delm);
    while(str){
        printf("%s", str);
        free(str);
        str = my_strtok(s, delm);
    }

    return 0;
}

 

پاسخ داده شده اردیبهشت 17, 1399 بوسیله ی ٍEydi (امتیاز 68)   5 14 16
برای اینگونه توابع که قرار است کاری متوالی روی یک رشته‌ای انجام بدند و یا اینکه به تعداد دفعات بالا فراخوانی شوند اصلاً کار درستی نیست که مداوم از سیستم‌عامل حافظه‌ای دریافت کنیم.

برای دیدن نحوهٔ صحیح پیاده‌سازی تابع ()strtok و یا هر یک از توابع libc پیشنهاد می‌کنم که از پیاده‌سازی Musl استفاده کنید :
https://git.musl-libc.org/cgit/musl/tree/src/string/strtok.c
سوال دانشجویی بود و باید جواب هاشون بدون استفاده از توابع از پیش تعریف شده باشه و گرنه که با c++ توکنایزش می کردیم.:)
...