0

我正在尝试标记刺痛,这是我的尝试。

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 不是持久的,当主函数调用 tokenize_next() 时,new_str 只是句子的第一个单词。提前致谢。

4

1 回答 1

1

它只打印出“This”的原因是因为您迭代到第一个非字母字符,它恰好是一个空格,并在这一行用一个空终止字符替换它:

new_str[i] = '\0'; 

在那之后,你对字符串的其余部分做什么都没有关系,它只会打印到那个点。下次调用 tokenize_next 时,字符串的长度不再是您认为的那样,因为它只计算单词“This”,并且由于“i”已经达到该数量,因此函数返回,因此每次连续调用它:

if ( i == len) 
{
  return NULL;
}

要修复该函数,您需要以某种方式更新指针以在下一次迭代中查看该字符。

然而,这是相当笨拙的。最好使用上述函数之一,例如strtokstrsep

更新:

如果您不能使用这些功能,那么重新设计您的功能将是理想的,但是,根据您的要求,请尝试以下修改:

#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);
}
于 2013-07-15T18:47:04.977 回答