我正在尝试将刺痛标记化,这是我的尝试。
char new_str[1024];
void tokenize_init(const char str[]){//copy the string into global section
strcpy(new_str,str);
}
int i = 0;
char *tokenize_next() {
const int len = strlen(new_str);
for(; i <= len; i++) {
if ( i == len) {
return NULL;
}
if ((new_str[i] >= 'a' && new_str[i] <= 'z') ||
(new_str[i] >= 'A' && new_str[i] <= 'Z')) {
continue;
}else {
new_str[i] = '\0';
i = i + 1;
return new_str;
}
}
return NULL;
}
//main function
int main(void) {
char sentence[] = "This is a good-sentence for_testing 1 neat function.";
printf("%s\n", sentence);
tokenize_init(sentence);
for (char *nt = tokenize_next();
nt != NULL;
nt = tokenize_next())
printf("%s\n",nt);
}
然而,它只打印出句子的第一个单词(即“This”)然后停止。有人可以告诉我为什么吗?我的猜测是我的new_str不是persisent,当主函数调用tokenize_next()时,new_str只是句子的第一个单词。提前谢谢。
答案 0 :(得分:1)
它只打印出“This”的原因是因为你迭代到碰巧是空格的第一个非字母字符,并在此行用一个空终止字符替换它:
new_str[i] = '\0';
在那之后,你对字符串的其余部分做了什么并不重要,它只会打印到那一点。下一次调用tokenize_next时,字符串的长度不再是你想象的那样,因为它只计算单词“This”,因为“i”已经达到了该函数返回的数量,因此每次连续调用它都是如此:
if ( i == len)
{
return NULL;
}
要修复该函数,您需要以某种方式更新指针,以便在下一次迭代时查看该字符。
然而,这是非常愚蠢的。最好使用上述功能之一,例如strtok或strsep
<强>更新强>
如果您无法使用这些功能,那么重新设计您的功能将是理想的,但是,根据您的要求,请尝试以下修改:
#include <string.h>
#include <cstdio>
char new_str[1024];
char* str_accessor;
void tokenize_init(const char str[]){//copy the string into global section
strcpy(new_str,str);
str_accessor = new_str;
}
int i = 0;
char* tokenize_next(void) {
const int len = strlen(str_accessor);
for(i = 0; i <= len; i++) {
if ( i == len) {
return NULL;
}
if ((str_accessor[i] >= 'a' && str_accessor[i] <= 'z') ||
(str_accessor[i] >= 'A' && str_accessor[i] <= 'Z')) {
continue;
}
else {
str_accessor[i] = '\0';
char* output = str_accessor;
str_accessor = str_accessor + i + 1;
if (strlen(output) <= 0)
{
str_accessor++;
continue;
}
return output;
}
}
return NULL;
}
//main function
int main(void) {
char sentence[] = "This is a good-sentence for_testing 1 neater function.";
printf("%s\n", sentence);
tokenize_init(sentence);
for (char *nt = tokenize_next(); nt != NULL; nt = tokenize_next())
printf("%s\n",nt);
}