我需要使用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帮助器的看法
要使代码可重入,请使用非标准代码 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)
你需要单独存放它们吗?两个指向修改的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)