显然,被调用它会卡在字符串中的第一个单词上,而不会触及其余部分。我不明白为什么。
int Belongs(char c, const char *delim)
{
int i;
i=0;
while(delim[i]!=0)
{
if(delim[i]==c) return 1;
i++;
}
return 0;
}
char *p;
char *Sstrtok(char *str, const char *delim)
{
int i;
i=0;
if(str==NULL)
{
str=p++;
}
while(str[i]!=0)
{
if(Belongs(str[i], delim)==1)
{
str[i]=0;
p=str+i;
return str;
}
i++;
}
return NULL;
}
感谢您的考虑。
答案 0 :(得分:0)
str = p++;
你必须做错了
str = p + 1;
或
str = ++p;
但是str = p + 1
更好,因为即使它返回NULL
如果找不到分隔符,则还有另一个问题:不返回字符串:
return NULL;
可能的解决方法:
p = str + i;
return *str ? str : NULL;
完整代码已修复:
#include <stddef.h>
int Belongs(char c, const char *delim) {
int i;
i = 0;
while (delim[i] != 0) {
if (delim[i] == c)
return 1;
i++;
}
return 0;
}
char *p;
char *Sstrtok(char *str, const char *delim) {
int i;
i = 0;
if (str == NULL) {
str = p + 1;
}
while (str[i] != 0) {
if (Belongs(str[i], delim) == 1) {
str[i] = 0;
p = str + i;
return str;
}
i++;
}
p = str + i;
return *str ? str : NULL;
}
答案 1 :(得分:0)
您Belongs()
的实施似乎没问题,但Sstrtok
有多个问题:
NULL
作为第一个指针调用,则应首先扫描第一个非分隔符。NULL
NULL
NULL
指针作为第一个参数调用该函数,使用静态指针执行上述步骤。以下是修改后的版本:
#include <stddef.h>
int Belongs(char c, const char *delim) {
int i;
for (i = 0; delim[i] != '\0'; i++) {
if (delim[i] == c)
return 1;
}
return 0;
}
char *Sstrtok_static_state;
char *Sstrtok(char *str, const char *delim) {
int i;
char *result;
if (str == NULL) {
str = Sstrtok_static_state;
if (str == NULL)
return NULL;
}
Sstrtok_static_state = NULL;
for (i = 0; str[i]; i++) {
if (!Belongs(str[i], delim)) {
result = str + i;
for (i++; str[i]; i++) {
if (Belongs(str[i], delim)) {
str[i] = '\0';
Sstrtok_static_state = str + i + 1;
return result;
}
}
return result;
}
}
return NULL;
}