1

ここに私のコードの一部があります:

int main ()
{
char *sentence;
char *token;

int counter = 1;
sentence = (char*)malloc(255*sizeof(char));

scanf("%[^\n]s", sentence);
token = strtok(sentence, " ");

char *temp;

while(token != NULL)
{
    printf("Token %d: %s\n", counter, token);
    token = strtok(NULL, " ");
    //temp = token;
    //temp = strtok(NULL, " ");

    counter++;
}
return 0;
}

「Why herrow there」と入力したときにこれを実行すると、次のようになります。

Token 1: why

Token 2: herrow

Token 3: there

temp のコメントを外すと、次のようになります。

Token1: why

Token 2: herrow

一時的にトークンの値を妨げなかったように思えますが、それでもトークンの値に影響します。temp が元のトークンに影響を与えたくありません。それ、どうやったら出来るの?

4

2 に答える 2

1

文字列には 3 つの単語があります。ステートメント"why herrow there"を追加する場合:temp

最初のステップ:

token = strtok(sentence, " ");   <-- sentence: `"why\0herrow there"` 
                                 // token = sentence
char *temp;

最初の反復:

while(token != NULL)  // token is not null <-------------------------------+
{                                                                          | 
    printf("Token %d: %s\n", counter, token); // first time print why      |
                                                                           |
    token = strtok(NULL, " ");  <-- sentence: `"why\0herrow\0there"`       |//step-2
                                <-- token points to "herrow" substring  (*)|
    temp = token;               <---temp = token                           |
    temp = strtok(NULL, " ");   <---sentence: `"why\0herrow\0there"`       |//step-3
                                <-- temp = "there" sub string              |//Last token
    counter++;                             |-------------------------------+
}

while ループの 2 回目の反復:

while(token != NULL) // token is not null, it is pointing to sustring "herrow"
{
    printf("Token %d: %s\n", counter, token); printing "herrow"
    token = strtok(NULL, " "); <-- no next token, token becomes NULL //step-4
    temp = token;    
    temp = strtok(NULL, " ");  <-- no next token, so temp becomes NULL //step-5

    counter++;
}

3 番目の反復トークンが NULL です

ループが壊れている間!

それで、それは印刷するだけです:

Token1: why

Token 2: herrow

コメントをもとに!

token = strtok(sentence, " "); // first token
next_token = token;
while(next_token != NULL){
    printf("Token %d: %s\n", counter, token);
    if(next_token = strtok(NULL, " "))
           token = next_token;   //Last token in string
    // here you have last token that is not NULL 
    counter++;
}
// next_token is NULL, but token is not NULL it is equals to last token in string
counter--;
printf("Token %d: %s\n", counter, token);

コード作業

于 2013-09-29T05:10:10.207 に答える
0

strtok()の再入可能バージョンを使用することで、目的を達成できますstrtok_r()

#define _POSIX_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{ 
  char * sentence = malloc(255 * sizeof(*sentence));

  scanf("%[^\n]s", sentence);

  {
    int counter = 0;
    char * sp1 = NULL;
    char * token = strtok_r(sentence, " ", &sp1);

    while (NULL != token)
    {
      counter++;

      printf("Token %d: %s\n", counter, token);
      token = strtok_r(NULL, " ", &sp1);

      {
        char * sp2 = sp1;
        char * temp = strtok_r(NULL, " ", &sp2);
        if (NULL != temp)
        {
          printf("Temp %d: %s\n", counter, temp);
          temp[strlen(temp)] = ' ';
        }
      }
    }
  }

  return 0;
}

注: これは、渡された区切り文字のセットに1strtok()文字しか含まれていない場合にのみ機能します(この例では)。' '

于 2013-09-29T10:11:55.067 に答える