存储指向句子中单词的指针

时间:2018-04-11 02:32:07

标签: c arrays string pointers

我遇到了一个问题,当一个句子中的字符指针存储到一个新数组中时,如果我在句子中添加一个'\ 0'字符来分割程序提前结束的单词,但是如果我这样做的话不添加该字符,然后新数组存储太多单词。

   int prevSpace = 1;
   for(int i = 0; i < (strlen(sentence)); i++){
       if(sentence[i] != ' ' && prevSpace == 1){
          prevSpace = 0;
          List[j] = &sentence[i];
          printf("list[%d] now points to %c\n", j, sentence[i]);
          j++;
       }

       if(sentence[i] != ' '){
           prevSpace = 0;
       }

       if(sentence[i] == ' '){
           /*if we find space and last char was not a space, add '\0'
           if(prevSpace == 0){
              printf("end added\n");
              sentence[i] = '\0';        /**** <<<FOCUS ON THIS LINE! */
           }

           prevSpace = 1;
       }
   }

   /*finish List with NULL*/
   List[j] = NULL;


   /*print out list of words*/
   for(int i = 0; i < count; i++){
      printf("List[%d] = %s\n", i, List[i]);
   }

这段代码的问题是,它不是每个单词的数组列表,而是只有第一个单词,然后是许多空值。对于句子“test one two three”,输出为:

list[0] now points to t

List[0] = test
List[1] = (null)
List[2] = (null)
List[3] = (null)

如果我将那条重要的行改为line [i] ='X';

然后输出句子“测试一二三”是:

list[0] now points to t
list[1] now points to o
list[2] now points to t
list[3] now points to t

List[0] = testX  oneX  twoX  three
List[1] = oneX  twoX  three
List[2] = twoX  three
List[3] = three

但这很糟糕,因为我希望list [0]只有“test”,list [1]只有“one”,list [2]只有“two”,list [3]只有有“三”。我需要一种方法,以便我可以使用字符串'\ 0'的结尾。

1 个答案:

答案 0 :(得分:1)

您的问题是,您试图将所有内容保留在string[]内,而不是将内容复制到list[]。您的for循环存在问题,因为它会重新检查strlen[string],并且在您添加\0后,您已缩短string,因此循环将停止。

我不知道你是如何处理记忆的,但是最好有像

这样的东西
char word[50][50]  //choose the values to suit - 1st is max words, 
                   //  2nd is max length of word

int i, j, k; 
//new loop
for(i = 0, j=0,k=0; i < (strlen(sentence)); i++, k++)
{
  word[j][k]=string[i];
  if (word[j][k]=' ')
  {
     word[j][k]=0;
     j++; k=0;  // to move to next word 
  }
}

这段代码应该是将句子中的单词放入2D数组字[] []

所需的全部代码