在c中标记句子的单词

时间:2012-04-17 21:26:25

标签: 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异常时会冻结。 感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:4)

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

尝试:

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

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

还要记住,复制令牌的循环不会在每个条目的末尾放置一个空终止符 - 我怀疑你可能会想要那些。也许试试:

strcpy(words[j], tokenPtr);

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

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

答案 1 :(得分:1)

好吧,也许这可以帮到你:

char** split (char* string, const char* delim) {
   char* p;
   int i = 0;
   char** array;

   array = malloc(strlen(string) * sizeof (char*));
   p = strtok (string, delim);
   while (p != NULL) {
      array[i] = malloc(sizeof(char) );
      array[i++] = p;
      p = strtok(NULL, delim);
    }
  return array;
}

然后在main

char s[128] = "Est2,2011,11,02,00,10,madrid,-3.467,44.3578,17.0";
char **array = split(s, ",");
int i = 0;
while (*array){
    printf("[%s]\n", *array++);
    i++;
}

希望它有所帮助。

答案 2 :(得分:1)

请记住,字符串以'\ 0'结尾作为分隔符,这意味着其中带有“a”的数组arr是2个字符长(arr [0]是'a',arr [1]是'\ 0'你可能想写。

a = strlen(tokenPointer) + 1

strncopy也可能有用,它的strcopy带有第三个参数,即要复制的字符串长度。

它将为您节省循环字符串,简化您的功能可能对您有价值。

enrmarc是正确的,动态分配内存是你可能采用的一种方式,你需要一个不规则的数组,你需要的确切大小。您还可以调用指向字符串IE char * stringArr [10]的指针数组,然后将stringArr [0]分配给您的第一个令牌,依此类推。我会假设这不是你想要的。

按照Michael Burr的建议,你的功能定义应该更像是:

void writeToStrArrayOneByOne(char words[][], char sentence[])

最后,调试很难,我没有完全回答你的问题。使用一些预处理器宏可以更轻松。尝试使用以下内容:

#define PRINT_CVAL(a) printf(#a "contains %c\n", a)

您可以将CVAL中的C和%c更改为I,将%d更改为整数,依此类推,它可以帮助您了解程序中存在问题的位置。