我正试图使用strtok()
将字符串拆分为两个令牌,这两个令牌中可能混合了空格和制表符。
所以我做了这个:
struct strstr
{
char *str,
*one,
*two;
};
typedef struct strstr *STRSTR;
void split(STRSTR);
int main()
{
STRSTR str = malloc(sizeof(struct strstr));
str->str = malloc(256);
fgets(str->str, 256, stdin);
split(str);
printf("%s, %sn", str->one, str->two);
free(str->str);
free(str);
return 0;
}
void split(STRSTR str)
{
int i;
char *temp = str->str;
while(isspace(*(str->str)))
str->str++;
str->one = strtok(str->str, " t");
for(i = 0; i < strlen(str->one); i++)
{
if(!isspace(str->one[i]))
str->str++;
}
str->str++;
if(str->str != NULL)
{
puts("In null if");
str->two = strtok(str->str, "");
}
str->str = temp;
}
例如,如果您输入Hello Earth lingss
,它将打印出Hello, Earth lingss
,这是完美的。
但是,如果我只输入Hello
,那么split函数将进入if(str->str != NULL)
语句内部。如何用我现有的代码阻止它这样做?
编辑:还有另一个问题,如果有人不介意的话。CCD_ 6将仅指向CCD_ 7中的第一个字。我怎样才能把它指向整件事呢?
在分割函数中的最后一个if块之前添加此语句
类str->str = strtok(str->str," t");
str->str = strtok(str->str," t");
if(str->str != NULL)
{
puts("In null if");
str->two = strtok(str->str, "");
}
您根据"t"
作为分隔符来分割字符串,但从未更改str->str
字符串,请使用上面的代码段,它应该可以很好地进行
strtok
是一个有趣的函数,它既修改传递的字符串,又在内部存储有关它的信息。您应该将字符串传递给strtok
一次,然后在后续调用中传递NULL。例如,如果您的目标是简单地将字符串分解为令牌(这显然是strtok
的作用),那么类似于:
#define BUFFER_SIZE 256
int main(void) {
char *buffer = malloc(BUFFER_SIZE);
if (!buffer) {
return -1;
}
fgets(buffer, BUFFER_SIZE, stdin);
char *word;
char *ptr = buffer;
printf("Tokens: [");
while ((word = strtok(ptr, " tn"))) {
printf("%s, ", word);
ptr = NULL;
}
printf("]n");
free(buffer);
}
将起作用。当我运行这样的代码时:
./quick
when in the fun apple orange
我得到以下结果:
Tokens: [when, in, the, fun, apple, orange, ]
重要的是,我只是在第一次通过循环时将buffer
指针传递给strtok
。之后,它被传递为NULL。