Pertanyaan C: penggunaan yang benar dari strtok_r


Bagaimana saya bisa menggunakan strtok_r daripada strtok untuk melakukan ini?

char *pchE = strtok(NULL, " ");

Sekarang saya mencoba menggunakannya strtok_r benar ... Tapi terkadang saya mendapat masalah dengan strtol. Saya memiliki thread yang saya jalankan 10 kali (pada saat yang sama).

char *savedEndd1;
char *nomeClass = strtok_r(lineClasses, " ", &savedEndd1);
char *readLessonS = strtok_r (NULL, " ", &savedEndd1);
char *readNTurma = strtok_r(NULL, " ",  &savedEndd1);

if (readNTurma==NULL)
printf("CLASS STRTOL begin %s %s\n",nomeClass, readLessonS );
int numberNTurma = strtol(readNTurma, NULL, 10);

Dan saya menangkap itu readNTurma == NULL beberapa kali ... Mengapa demikian? Tidak mengerti mengapa itu terjadi NULL?


32
2018-04-12 00:41


asal


Jawaban:


Itu dokumentasi untuk strtok_r cukup jelas.

Fungsi strtok_r () adalah strtok versi reentrant (). Argumen saveptr adalah pointer ke variabel * char yang digunakan secara internal oleh strtok_r () untuk mempertahankan konteks antara panggilan berturut-turut yang menguraikan string yang sama.

Pada panggilan pertama ke strtok_r (), str harus menunjuk ke string yang akan diurai, dan nilai saveptr diabaikan. Pada panggilan berikutnya, str harus NULL, dan saveptr seharusnya tidak berubah sejak panggilan sebelumnya.

Jadi Anda akan memiliki kode seperti

char str[] = "Hello world";
char *saveptr;
char *foo, *bar;

foo = strtok_r(str, " ", &saveptr);
bar = strtok_r(NULL, " ", &saveptr);

34
2018-04-12 00:47



Jawaban ini hanya menambah jawaban yang diterima.

Contoh saya yang diuji:

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

int main(void)
{
    char str[] = "1,22,333,4444,55555";
    char *rest = NULL;

    for (char token = strtok_r(str, ",", &rest);
         token != NULL;
         token = strtok_r(NULL, ",", &rest)) {   
        printf("token:%s\n", token);
    }
}

Hasil.

token:1
token:22
token:333
token:4444
token:55555

Uji: http://codepad.org/6QZMa0h5

Dari dokumentasi linux di mana penekanan adalah milik saya:

char *strtok_r(char *str, const char *delim, char **saveptr);

Fungsi strtok_r () adalah strtok versi reentrant (). Argumen saveptr adalah pointer ke variabel * char yang digunakan secara internal oleh strtok_r () untuk mempertahankan konteks antara panggilan berturut-turut yang menguraikan string yang sama.

Pada panggilan pertama ke strtok_r (), str harus mengarah ke string yang akan diurai, dan nilai saveptr diabaikan. Pada panggilan berikutnya, str harus NULL, dan saveptr seharusnya tidak berubah sejak panggilan sebelumnya.

String yang berbeda dapat diurai secara bersamaan menggunakan urutan panggilan ke strtok_r () yang menentukan argumen saveptr yang berbeda.


9
2018-01-09 12:48



char str[]="string for sample";
char *reserve;
char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL

1
2018-04-12 00:46