在c中使用strtok

shi*_*juo 14 c strtok

我需要使用strtok读取名字和姓氏并将其分开.如何在两个单独的char数组中存储我可以独立使用它们的名称?

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

int main ()
{
  char str[] ="test string.";
  char * test;
  test = strtok (str," ");
  while (test != NULL)
  {
    printf ("%s\n",test);
    test= strtok (NULL, " ");
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 19

这是我对一个相当简单的tokenize帮助器的看法

  • store导致一个动态增长的数组
  • null终止数组
  • 保持输入字符串安全(strtok修改输入字符串,这是文字char []上的未定义行为,至少我认为在C99中)

要使代码可重入,请使用非标准代码 strtok_r

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

char** tokenize(const char* input)
{
    char* str = strdup(input);
    int count = 0;
    int capacity = 10;
    char** result = malloc(capacity*sizeof(*result));

    char* tok=strtok(str," "); 

    while(1)
    {
        if (count >= capacity)
            result = realloc(result, (capacity*=2)*sizeof(*result));

        result[count++] = tok? strdup(tok) : tok;

        if (!tok) break;

        tok=strtok(NULL," ");
    } 

    free(str);
    return result;
}

int main ()
{
    char** tokens = tokenize("test string.");

    char** it;
    for(it=tokens; it && *it; ++it)
    {
        printf("%s\n", *it);
        free(*it);
    }

    free(tokens);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个strtok免费的重新实现(使用strpbrk相反):

char** tokenize(const char* str)
{
    int count = 0;
    int capacity = 10;
    char** result = malloc(capacity*sizeof(*result));

    const char* e=str;

    if (e) do 
    {
        const char* s=e;
        e=strpbrk(s," ");

        if (count >= capacity)
            result = realloc(result, (capacity*=2)*sizeof(*result));

        result[count++] = e? strndup(s, e-s) : strdup(s);
    } while (e && *(++e));

    if (count >= capacity)
        result = realloc(result, (capacity+=1)*sizeof(*result));
    result[count++] = 0;

    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为`realloc`行应该有`sizeof(*result)`,而不是`sizeof(result)`,第一个参数应该是`result`而不是`realloc`. (2认同)

u0b*_*6ae 7

你需要单独存放它们吗?两个指向修改的char数组的指针将产生两个独立的完全可用的字符串.

那是我们改变这个:

char str[] ="test string.";
Run Code Online (Sandbox Code Playgroud)

进入:

char str[] ="test\0string.";
             ^     ^
             |     |
char *s1 -----     |
char *s2 -----------
Run Code Online (Sandbox Code Playgroud)

.

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

int main ()
{
  char str[] ="test string.";
  char *firstname = strtok(str, " ");
  char *lastname = strtok(NULL, " ");
  if (!lastname)
    lastname = "";
  printf("%s, %s\n", lastname, firstname);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)