我正在尝试实现一个简单的程序来分隔文件中的每个单词。这是我第一次使用strtok(),所以我试图创建一些简单的东西,看它是如何工作的。但是,我无法使代码正常工作。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char* tokenize(char *tempPhrase);
int main (void)
{
FILE *in;
char file_name[] = "test1.txt";
char buffer[100];
char *tokens = malloc (100 * sizeof (char));
int i;
chdir("./DataFiles");
if (( in = fopen(file_name, "r")) == NULL)
{
printf("Can't open %s for reading.\n", file_name);
return 0;
}
fgets(buffer, 100, in);
printf("%s\n", buffer);
*tokens = tokenize (buffer);
for (i = 0; tokens[i] != NULL; i++)
{
printf("%s\n", tokens[i]);
}
return 0;
}
char* tokenize(char *tempPhrase)
{
char *search = " ";
char *tempArray = malloc (20000 * sizeof (char));
int i = 0;
tempArray[i] = strtok(tempPhrase, search);
while(tempArray[i] != NULL)
{
i++;
tempArray[i] = strtok(tempPhrase, search);
}
return tempArray;
}
当我尝试编译时,我收到以下错误/警告:
fopen.c: In function ‘main’:
fopen.c:28: warning: comparison between pointer and integer
fopen.c:30: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
fopen.c: In function ‘tokenize’:
fopen.c:45: warning: assignment makes integer from pointer without a cast
fopen.c:47: warning: comparison between pointer and integer
fopen.c:50: warning: assignment makes integer from pointer without a cast
为什么strtok()函数会使tempArray成为整数?这在整个程序中引起了各种各样的问题,我无法弄明白。
答案 0 :(得分:1)
我可以看到您的代码中存在一些问题:
char tokens = malloc (100 * sizeof (char));
这一行你malloc
不是指针的东西,它至少应该是char* tokens
。
那应该摆脱一些
fopen.c:28: error: subscripted value is neither array nor pointer
警告
您在tokenize
函数中再次执行了相同操作。
然后malloc
之后应始终跟free
调用,以释放您使用过的内存。否则你有泄漏。
所以,当你完成它时,你需要调用free(tokens)
。第二次malloc
来电也是如此。
根据strtok
文档,如果您希望它从中断处继续进行标记,则应使用其第一个参数strtok
调用NULL
。
所以tempArray[i] = strtok(tempPhrase, search);
应该看起来像这样
tempArray[i] = strtok(NULL, search);
,以便继续对您最初传递的字符串进行标记。
你的tempArray
init应该更像这样
char** tempArray = malloc(10 * sizeof(char*));
//初始化第一个数组
您需要char**
的原因是因为您需要一个字符串数组,而C中的字符串由char*
表示,所以现在您需要一个指向{{1}数组的指针} char*
这些只是我能看到的一些问题,而不是真正尝试编译代码。