我正在尝试用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;
}
Run Code Online (Sandbox Code Playgroud)
这会导致无限循环.为什么?
您需要两次调用,第二次需要传递NULL strtok.
代替:
while ((cPToken = strtok(sLine, ".,; !?\r\n")) != NULL) { /* Split into words */
iCntr++;
}
Run Code Online (Sandbox Code Playgroud)
做
cPToken = strtok(sLine, ".,; !?\r\n");
while (cPToken != NULL) { /* Split into words */
iCntr++; /* we have a valid word */
cPToken = strtok(NULL, ".,; !?\r\n");
}
Run Code Online (Sandbox Code Playgroud)
编辑:完整来源:
#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;
}
Run Code Online (Sandbox Code Playgroud)
使用输入文件,我得到结果为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;
}
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果 - 16.
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |