我用otherItems
浏览了文件。
我将fgets
返回的句子标记为fgets
以检索单词
我将单词保存在strtok
char*
现在,我要遍历包含文件单词的while (fgets(chaine, TAILLE_MAX, fichier) != NULL) {
chainetoken = strtok(chaine, " ");
while (chainetoken != NULL) {
tableau[i] = chainetoken;
chainetoken = strtok (NULL, " ");
i++;
}// it works wel
}
printf("%d \n", i);
(char*
)数组,以便查找用户输入的单词并找到前面和后面的2个单词在文件中关注
tableau[i]
答案 0 :(得分:2)
您有三个错误
1)in
while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
{
chainetoken=strtok(chaine," ");
while (chainetoken != NULL)
{
tableau[i]= chainetoken;
chainetoken = strtok (NULL," ");
i++;
}// it works wel
}
您需要保存 strtok 的结果的副本( strdup ),否则,您总是要保存指向内部的指针每个 fgets
修改过的chaine2) strtok 的分隔符必须为“ \ n”,否则'\ n'是 strtok
返回的结果的一部分3)in
for (j=0; j<i; j++)
{
printf ("tableau %d.mot %s \n",i,tableau[i]);//tableau[0]=last word of the file
if (strcmp(mot_recherche,tableau[i])==0)
printf("this word exist \n");
}//doesn't work,it save only the last word of the array(of the file)!!!!
您查看的是条目 i 而不是 table
的 j附加说明:在 while 中,您需要检查 i 是否达到 table 中的条目数,否则您就有写风险出来。
(编辑以解释为什么需要复制strtok的结果)
以与您一样的方式使用 strtok 的程序(不重复):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE * fichier = fopen("in", "r");
if (fichier != NULL)
{
#define TAILLE_MAX 32
char chaine[TAILLE_MAX];
char * chainetoken;
char * tableau[16];
int i = 0, j;
while ((fgets(chaine, TAILLE_MAX, fichier) != NULL) &&
(i != sizeof(tableau)/sizeof(tableau[0])))
{
chainetoken=strtok(chaine," \n");
while (chainetoken != NULL)
{
tableau[i]= chainetoken;
chainetoken = strtok (NULL," \n");
i++;
}
}
fclose(fichier);
for (j = 0; j != i; ++j)
printf("'%s'\n", tableau[j]);
}
编译和执行:
/tmp % gcc -pedantic -Wextra f.c
/tmp % cat in
1234 5678
1 23 45 678
/tmp % ./a.out
'1'
'45'
'1'
'23'
'45'
'678'
预期结果是看到1234 5678 1 23 45 678
,但事实并非如此,只有in
第二行的内容是正确的(因为它是文件的最后一行)。
strtok 返回 chaines 的子字符串,并在每次返回非null指针时对其进行修改以添加null char,因此(我在null字符下方用' @')
tableau[0]
tableau[1]
tableau[2]
tableau[3]
中的 chaine + 8 (“ 678 @”)所以现在 chaine 包含“ 1 @ 23 @ 45 @ 678 @”,并且 table 中的指针为:
这就是为什么需要复制 strtok 的结果的原因:
tableau[4]
编译和执行:
tableau[5]