1

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

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 异常时一样冻结。感谢任何帮助,谢谢。

4

3 回答 3

4

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

尝试:

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

这将sentence生成一个可修改的字符数组。

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

strcpy(words[j], tokenPtr);

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

  • 处理可能太长的令牌
  • 获取带有太多标记的字符串
  • 如果令牌之间有多个空格,则需要做什么-strtok()如果对您很重要,则不处理(我之所以提到这一点只是因为在您的问题中您特别提到令牌“仅由一个空格分隔”)
于 2012-04-17T21:30:00.470 回答
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++;
}

希望能帮助到你。

于 2012-04-17T21:34:40.330 回答
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 用于整数等等,它可以帮助您了解您的程序中哪里有问题。

于 2012-04-17T22:36:42.047 回答