gpt4 book ai didi

c - 意外的 strtok() 行为

转载 作者:太空狗 更新时间:2023-10-29 14:58:21 25 4
gpt4 key购买 nike

我正在尝试使用 strtok() 计算文件中的单词数。

/*
* code.c
*
* WHAT
* Use strtok() to count the number of words in a file.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRMAX 128

int main() {
/* Declarations */
FILE* fptr;
int iCntr = 0;
char sLine[STRMAX];
char* cPToken;

/* Read file */
/* Error handler */
if ((fptr = fopen("/home/ubuntu/Dropbox/Unief/C/H18/Opdr01/Debug/test.txt", "r")) == NULL) {
printf("Couldn't read test.txt.\n");
exit(0);
} else {
while (fgets(sLine, STRMAX-1, fptr) != NULL) { /* Read line */
while ((cPToken = strtok(sLine, ".,; !?\r\n")) != NULL) { /* Split into words */
iCntr++;
}
}
printf("Number of words: %d\n", iCntr);
}

/* Always clean up your mess */
fclose(fptr);
return 0;
}

这会导致无限循环。为什么?

最佳答案

你需要两次调用,第二次你需要将 NULL 传递给 strtok

代替:

while ((cPToken = strtok(sLine, ".,; !?\r\n")) != NULL) {  /* Split into words */
iCntr++;
}

cPToken = strtok(sLine, ".,; !?\r\n");
while (cPToken != NULL) { /* Split into words */
iCntr++; /* we have a valid word */
cPToken = strtok(NULL, ".,; !?\r\n");
}

编辑:完整来源:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

size_t wcount(const char *fname, const char *delim) {
char buf[ 512 ];
size_t nw = 0;
FILE *fp = fopen(fname, "r");
if (fp) {
while (fgets(buf, sizeof buf, fp) != NULL) {
for (char *w = strtok(buf, delim); w; w = strtok(NULL, delim))
nw++;
}
fclose(fp);
}
return nw;
}

int main(int argc, char* argv[])
{
printf("%u\n", wcount("C:\\sample.txt", ".,; !?\r\n"));
return 0;
}

根据你的输入文件,我得到的结果是 16。

编辑# 2:修改您的来源:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRMAX 128

int main() {
/* Declarations */
FILE* fptr;
int iCntr = 0;
char sLine[STRMAX];
char* cPToken;

/* Read file */
/* Error handler */
if ((fptr = fopen("c:\\test.txt", "r")) == NULL) {
printf("Couldn't read test.txt.\n");
exit(0);
} else {
while (fgets(sLine, STRMAX-1, fptr) != NULL) { /* Read line */
cPToken = strtok(sLine, ".,; !?\r\n");
while (cPToken != NULL) { /* Split into words */
iCntr++;
cPToken = strtok(NULL, ".,; !?\r\n");
}
}
printf("Number of words: %d\n", iCntr);
}

/* Always clean up your mess */
fclose(fptr);
return 0;
}

我得到相同的结果 -- 16。

关于c - 意外的 strtok() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2265418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com