C strtok的更清洁实现
只是为了好玩,我写了一个程序,将采取一个用户输入的字符串(甚至可能是一个文本文档)和混乱的字符串中的字 我试图使用C strtok的更清洁实现,c,string,delimiter,strtok,C,String,Delimiter,Strtok,只是为了好玩,我写了一个程序,将采取一个用户输入的字符串(甚至可能是一个文本文档)和混乱的字符串中的字 我试图使用strtok函数来分隔字符串中的每个单词。目前,我觉得我当前对strtok的实现是草率的: int main(int argc, char *argv[]) { char *string, *word; if(!(string = getstr())) //function I wrote to retrieve a string {
strtok
函数来分隔字符串中的每个单词。目前,我觉得我当前对strtok的实现是草率的:
int main(int argc, char *argv[])
{
char *string, *word;
if(!(string = getstr())) //function I wrote to retrieve a string
{
fputs("Error.\n", stderr);
exit(1);
}
char array[strlen(string) + 1]; //declare an array sized to the length of the string
strcpy(array, string); //copy the string into the array
free(string);
if(word = strtok(array, " "))
{
//later I'll just write each word into a matrix, not important right now.
while(word = strtok(NULL, " "))
{
//later I'll just write each word into a matrix, not important right now.
}
}
return 0;
}
我觉得必须有一种更干净的方法来实现strtokstrtok
,而不必在程序中途声明数组。我就是觉得不对。使用strtok是正确的方法吗?我不想使用固定大小的数组,因为我喜欢所有的东西都是动态的,这就是为什么我开始怀疑使用strok
是否正确。你可以使用scanf()
而不是getstr()
和strok()
用户应使用以下命令停止输入字符:
- EOF=CTRL+D(对于Linux)
- EOF=CTRL+Z(适用于Windows)
const char*
提供给您的,您只需要复制它,即不允许您修改缓冲区的内容
最好使用
strtok\u r
,因为常规的strtok
是不可重入的。free(string)代码>为什么?我没有看到任何malloc
,是否getstr()
动态分配内存?char数组[strlen(string)]
需要字符数组[strlen(string)+1]
@AlokSavegetstr()
会动态分配内存@保罗:我刚刚更新了,谢谢。顺便说一句,是术语问题。你不是在“实现”strtok
,你是在“调用”它。@SteveJessop,我也被这个问题弄糊涂了。抱歉,为了更清楚起见,我编辑了我的问题,我试图动态地这样做,我不想使用scanf
“最好将strtok\r用作常规strtok,而不是可重入的。”+1用于此评论。我想知道OP是想实现“真正的”strtok,并包含它的所有缺点(主要是不可重入的),还是想实现一个更好的strtok。
char word[100];
while(scanf(" %s",word)!=EOF) {
// use the word string here
}