c - 标记 c 中句子的单词

标签 c

我正在尝试将一个句子标记为仅由一个空格分隔的单词。 我需要从句子中获取单词,然后将它们写入订阅数组。 这是我的作品:

void writeToStrArrayOneByOne(char words[10][20], char *sentence){

       char *tokenPtr;
       int j = 0;
       int a,i;
       tokenPtr = strtok(sentence," ");

       while(tokenPtr != NULL){


          a = strlen(tokenPtr);

          for(i=0;i<a;i++){

                words[j][i] = tokenPtr[i];
          }
          tokenPtr = strtok(NULL," ");
          j++;

       }

为了从 main 调试,我只用这个调用函数:

     char words[10][20];
     char *sentence = "this is a token";
     writeToStrArrayOneByOne(words,sentence);

但是它像 EOF 异常时一样卡住。 感谢任何帮助,谢谢。

最佳答案

strtok() 修改它传递的字符串。你给它一个不能修改的字符串文字。

尝试:

char sentence[] = "this is a token";

这将使 sentence 成为可修改的字符数组。

另请记住,您复制标记的循环不会在每个条目的末尾放置空终止符 - 我怀疑您可能需要这些。也许试试:

strcpy(words[j], tokenPtr);

您应该考虑的其他事项包括:

  • 处理可能太长的 token
  • 得到一个包含太多标记的字符串
  • 如果 token 之间有一个以上的空格需要做什么 - strtok() 不会处理如果这对你很重要(我提到这一点只是因为在你的问题中你特别提到标记“仅由一个空格分隔”)

关于c - 标记 c 中句子的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199416/

相关文章:

c - 将 Ruby 解释器链接到 C 程序中

c++ - 在 memset 等上使用结构初始化 ({...}) 是否更可取/可以?

c++ - 在 linux 上的 C/C++ 中,如何创建预锁定的互斥体

javascript - 为什么 (x += x += 1) 在 C 和 Javascript 中的计算方式不同?

c - 后缀列表中的内存有效搜索

c - 中位数和众数不正确

c - 32 位架构 (GCC) 上的 8 位 int 与 32 位 int

c - 编译器是否将内存放置在堆上?

c - 编辑源文件后,“make”不会重新编译

c++ - 使用带有 C 结构的 C++ 模板进行内省(introspection)?