【发布时间】:2020-10-24 11:35:20
【问题描述】:
我正在开发一个 C 语言的字数统计程序。 一切正常,但是当我谈到撇号字符控制时,我有点困惑。 问题是,我的程序无法识别这两个示例之间的区别:Ive 和 Jem 的。 如果单词中有撇号字符,我的程序会将其计为两个单词。应该将第一个示例计为 2 个单词,将第二个示例计为一个单词。 请问您有什么问题吗?
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int main(void) {
string inputstr;
int letters = 0;
int words = 0;
int sentences = 0;
char c;
float index;
inputstr = get_string("Text:");
for (int i = 0; i <= strlen(inputstr); i++)
{
c = inputstr[i];
if (isalnum(c))//count letters
{
letters++;
}
else if (isspace(c) || c == '\0' || c == 39)//count words
{
words++;
}
else if (c == '.' || c == '?' || c == '!')//count sentences
{
sentences++;
}
}//end of for loop
return 0;
}// end of main
【问题讨论】:
-
准确地做起来相当棘手。您可能不得不大幅增加算法的复杂性。
-
如果不真正了解单词以及撇号符号的省略方式,您想要实现的目标是不可能的。您的程序如何知道“Jem's”是指“Jem 是”还是“属于 Jem”?你的程序甚至知道这些单词是英文的吗?
-
您需要一个相当复杂的有限状态机 + 一些启发式方法。 (或撇号后允许的片段的查找表)另一种方法是始终将构造视为由标记器生成的三个单独的标记,并且可能在第二个中合并标记(语义) 步骤。
-
显示您的代码。
-
别忘了
Smiths'只有一个字。