S ++ dasturlari Borland uchun 2 ta belgidan iborat bo'ladi

`char *ParseCmdX(char *buf,int len)  
{  
 char *p;  
 p = strtok(buf," ,");  
 p = strtok(NULL," ,");  
 char *ptr = (char *)malloc(strlen(p)+1);  
 strcpy(ptr,p);  
 return ptr;  
}`

Nima uchun p = strtok (NULL, ","); da Access buzilishi xatosini olamanmi? Men NULL parametrini qo'yganimda ...

buf "das sdg hfg jgh"

Menga kim yordam berishi mumkin?

1
"das gfd jgh khh" - buf
qo'shib qo'ydi muallif Hakon89, manba
@ Buni c ++ deb belgilagansiz, lekin siz malloc , char * va strcpy kabi narsalarni ishlatmoqdasiz. Buning uchun sabablar bormi? Yo'q.
qo'shib qo'ydi muallif greatwolf, manba
"buf" da nimani anglatadi?
qo'shib qo'ydi muallif Joe, manba

2 javoblar

Siz strtokga birinchi chaqiriqni, ya'ni strtok (ammo ",") NULL-ni qaytarmikin yoki yo'qligini tekshirib ko'rishingiz kerak, agar u amalga oshirilgan bo'lsa strtokga keyingi chaqiruv o'lib qoladi. bufda ParseCmdX ga nima o'tishingiz kerak?

0
qo'shib qo'ydi
Ahmad to'liq aniq. "das sdg hfg jgh" uchun "p" yo'q, shuning uchun p null. P null bo'lsa, qaytib keladigan boshqa hech narsa yo'q, shuning uchun keyingi strtok chaqiruv mag'lubiyatning oxiridan chiqadi. Bang, burun jinlar hamma joyda :)
qo'shib qo'ydi muallif EvilTeach, manba
Nima uchun u NULLni qaytarishi kerak? agar "string hfdkj gdhk fhjsk"
qo'shib qo'ydi muallif Hakon89, manba
Chekni men qildim va u hali ham AV xatolikka uchraydi
qo'shib qo'ydi muallif Hakon89, manba
Agar istalgan token topilmasa va null terminatorga hali erishilmagan bo'lsa, strtok() NULLni qaytarmaydi, kirish satrining qolgan qismini null terminatorga qaytaradi. Bundan tashqari, strtok() ning ikkinchi parametri 1-xar ajratuvchi bilan set dir. Bu holda, '' '' yoki ',' belgilarini alohida-alohida qidirishadi. ',' 'belgisi satrda mavjud emas, lekin >' ' bajaradi, shuning uchun strtok() har qanday NULLni qaytara olmaydi. Menimcha, Jou to'g'ri. Kirish satrlari, ehtimol, faqat o'qiladi, shuning uchun strtok() mag'lubiyatga null belgilar qo'shilsa, chalkashadi.
qo'shib qo'ydi muallif Remy Lebeau, manba

Bu funksiyani qanday qilib chaqirasiz va bufer qanday ajratiladi? Yodda tutingki, buf faqat o'qiladi yoki const (strtok kiritilgan buferni o'zgartiradi).

Bu ishlaydi, chunki x o'zgaruvchan:

  char x[] = "das sdg hfg jgh";
  char *c = ParseCmdX(x, strlen(x));

Biroq, bu seg xatolar:

   char *y = "das sdg hfg jgh";
   char *c = ParseCmdX(y, strlen(y));
0
qo'shib qo'ydi