意外的 strtok() 行为 [英] Unexpected strtok() behaviour
本文介绍了意外的 strtok() 行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用 strtok() 计算文件中的单词数.
I'm trying to count the number of words in a file with 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;
}
这会导致无限循环.为什么?
This causes an infinite loop. Why?
推荐答案
需要两次调用,第二次需要传NULL给strtok
.
You need two calls, the second time you need to pass NULL to 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.
With your input file, I get the result as 16.
编辑#2:修改您的来源:
Edit# 2: Modifying your source:
#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.
I get the same result -- 16.
这篇关于意外的 strtok() 行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文