C语言 strtok是如何工作的?


#include <stdio.h>
#include<string.h>
int main() {
char a[]="hey -* there -* minecraft-; jukebox! ";
char *p=strtok(a,"-");
//printf("%s",a);        --line-id(00)
while(p!= NULL)
{
printf("%s",p);      //line-id(01)
p=strtok(NULL,"-");
}
printf("n");
p=strtok(a,"*");
while(p!=NULL)
{
printf("%s",p);
p=strtok(NULL,"*");
}
return 0;
}

输出:

hey * there * Minecraft; jukebox! 
hey 

但是我需要的输出是:

hey * there * Minecraft; jukebox! 
hey there Minecraft jukebox!

Q)为什么我不能改变行id(01)到print("%s",*p),因为p是一个指针,我们应该使用*p来获得值,p指向右…?我得到一个分割错误。

Q)如果我使用print("%s",a),我得到它们作为输出line-id(00);为什么?

Q)如果可能,解释strtok()中使用的指针p。strtok是如何工作的?

strtok()修改输入字符串。首先复制它。strdup()是你的朋友。

如果你的编译器抱怨它不能找到strdup()复制/粘贴到。

char *strdup(const char *s)
{
size_t len = strlen(s) + 1;
char *t = malloc(len);
if (!t) return NULL;
memcpy(t, s, len);
return t;
}

从字符数组中删除分隔符的另一个选项是用后续字符覆盖分隔符,从而收缩数组。

#include <stdio.h>
#include<string.h>
int main() {
char a[]="hey -* there -* minecraft-; jukebox! ";
char delimeters[] = "-*;";
char *to = a;
char *from = a;
for ( int each = 0; each < 3; ++each) {//loop through delimiters
to = a;
from = a;
while ( *from) {//not at terminating zero
while ( *from == delimeters[each]) {
++from;//advance pointer past delimiter
}
*to = *from;//assign character, overwriting as needed
++to;
++from;
}
*to = 0;//terminate
printf ( "%sn", a);
}
return 0;
}

输出
hey * there * minecraft; jukebox! 
hey  there  minecraft; jukebox! 
hey  there  minecraft jukebox! 

相关内容

  • 没有找到相关文章

最新更新