#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!