在c中对输入文件进行标记

时间:2015-09-12 18:29:04

标签: c tokenize strtok

我正在尝试实现一个简单的程序来分隔文件中的每个单词。这是我第一次使用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成为整数?这在整个程序中引起了各种各样的问题,我无法弄明白。

1 个答案:

答案 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*

这些只是我能看到的一些问题,而不是真正尝试编译代码。

Here is a version of your program that compiles