С ++ белгісі Борлендке 2 таңбаға дейін жетеді

`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;  
}`

p = strtok (NULL, «,»); дегеніміз неге Access нұқсан қатесін алуым керек? Мен NULL параметрін қойған кезде ол ...

буф дегеніміз «das sdg hfg jgh»

Маған біреу көмектесе алады ма?

1
«das gfd jgh khh» - buf
қосылды автор Hakon89, көзі
@ Сіз оны c ++ ретінде белгілегенсіз, бірақ сіз malloc , char * және strcpy сияқты заттарды пайдаланып жатырсыз. Жолдар мен ақылды көрсеткіштерді пайдаланудың орнына, осылай істеп жатырсыз ба?
қосылды автор greatwolf, көзі
«буф» мәніндегі нәрсе неге ұқсас?
қосылды автор Joe, көзі

2 жауаптар

Сіз strtok-ға бірінші қоңырау, яғни strtok (бірақ «,») NULL-ні қайтарған-бермегенін тексеріп көруіңіз керек, егер солай болса, strtok-ға келесі қоңырау өледі. бұл парфеде ParseCmdX-ге не жатады?

0
қосылды
Ахмед дәл дұрыс. «das sdg hfg jgh» үшін «жоқ», «p» - NULL. Бір рет болған кезде p қайтарудың ешнәрі жоқ, сондықтан келесі strtok қоңырауы жолдың соңынан шығып кетеді. Бэнг, барлық жерде жыныстық демондар :)
қосылды автор EvilTeach, көзі
неге ол NULL қайтаруы керек? Егер мен string ретінде «asd hfdkj gdhk fhjsk»
қосылды автор Hakon89, көзі
Мен тексеруді жасадым және ол әлі де AV-ге қате түседі
қосылды автор Hakon89, көзі
Егер сұралған таңбалауыш табылмаса және нөлдік терминатор әлі қол жеткізілмесе, strtok() NULL қайтармайды, кіріс жолының қалған бөлігін нөлдік терминаторға дейін қайтарады. Бұдан басқа, strtok() екінші параметрі 1-шектік шектегіштердің жиынтығы болып табылады. Бұл жағдайда ол '' немесе ',' таңбаларын жеке іздейді. ',' таңбасы жолда жоқ, бірақ strtok() бәрібір NULL қайтармайды. Джо дұрыс деп ойлаймын. Енгізу жолы ең алдымен тек оқуға арналған, сондықтан strtok() жолға нөлдік таңбаны кіргізгенде бұзылады.
қосылды автор Remy Lebeau, көзі

Бұл функцияны қалай шақырасыз және бума қалай бөлінеді? Есте сақтаңыз, buf тек оқу үшін немесе const (strtok кіріс аралықты өзгертілген деп өзгертеді).

Бұл жұмыс істейді, өйткені x өзгереді:

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

Дегенмен, бұл сегменттегі кемшіліктер:

   char *y = "das sdg hfg jgh";
   char *c = ParseCmdX(y, strlen(y));
0
қосылды