我试图编写一个程序,计算文本中字母、单词和句子的数量。我可以假设一个字母是从a到z的任何小写字符或从a到z的任何大写字符,任何由空格分隔的字符序列都应算作一个单词,任何句点、感叹号或问号的出现都表示一个句子的结束。
到目前为止,我可以正确地计算字母和句子的数量,但是我错过了单词的数量:
例如是!
输出应为:3个字母1个单词1个句子
我得到的是:3个字母0个单词1个句子
更新:在printf函数前面的末尾键入另一个(单词)后,它现在可以正常工作。谢谢大家的帮助:)。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
string text = get_string("Enter text: ");
printf("Output:\n");
int lettercount;
int words = 0;
int sentences = 0;
int letters = 0;
int length = strlen(text);
for(lettercount = 0; lettercount < length; lettercount++)
{
if(isalpha(text[lettercount]))
{
letters++;
}
else if(text[lettercount] == ' ' || text[lettercount] == '\t' || text[lettercount] == '\n' || text[lettercount] == '\0')
{
words++;
}
else if(text[lettercount] == '.' || text[lettercount] == '!' || text[lettercount] == '?')
{
sentences++;
}
}
words++;
printf("%i letter(s)\n", letters);
printf("%i word(s)\n", words);
printf("%i sentence(s)\n", sentences);
}
你总是有单词-1,因为你只在空格或新行后向计数器添加新词,但是最后一个单词呢!?总是最后一个单词将不被计算,所以在计算任何段落后,添加1到您的单词计数器。例句:是的!--
代码的主要问题是,如果输入文本中的“final”字后面没有空格,则它不会对其进行计数(终止的'\0'
字符将不会是测试字符串的一部分,因为strlen
函数不包括该字符。
此外,如果您的单词被多个空格分隔,您将遇到问题;为了解决这个问题,您可以使用inWord
标志来跟踪当前字符是否已经在单词中,如果没有,则设置每当我们找到一封信时,就标记。
此外,如果你有“…”之类的东西,你的句子数也会有问题
在您的输入中;在你的
句子后面注释掉的行
行将修复该问题(如果您愿意)。
最后,为了准确起见,你不应该假设字母“a”到“z”和“A”到“Z”将是一个连续的序列。它们可能是(现在大多数系统使用ASCII编码),但是您应该使用isalpha函数以获得更多的可移植性(以及isspace函数)。
int main(void)
{
string text = get_string("Enter text: ");
printf("Output:\n");
int lettercount;
int words = 0;
int sentences = 0;
int letters = 0;
int inWord = 0;// Set to 1 if we are inside a (new) word!
int length = (int)(strlen(text)); // Don't evaluate length on each loop!
for (lettercount = 0; lettercount < length; lettercount++) {
int testChar = text[lettercount]; // Get a local copy of the current character
if (isalpha(testChar)) { // Don't assume that 'a' ... 'z' and 'A' ... 'Z' are in contiguous sequences
letters++;
if (!inWord) words++; // Any letter means that we're in a (possibly new) word...
inWord = 1; // ... but now set this 'flag' so as not to count others!
}
else if (testChar == '.' || testChar == '!' || testChar == '?') {
sentences++;
// if (inWord) sentences++; // Check that we're in a word, or stuff like "..." will be wrong
inWord = 0; // Now we are no longer inside our current word
}
else if (isspace(testChar)) { // We could also just assume ANY other character is a non-word
inWord = 0; // Now we are no longer inside our current word
}
}
printf("%i letter(s)\n", letters);
printf("%i word(s)\n", words);
printf("%i sentence(s)\n", sentences);
return 0;
}
请随时要求任何进一步的澄清和/或解释。
你能帮我在这段代码中添加一个额外的检查吗?这个检查可以帮助我找出每一段的字数? BufferedReader br=新的BufferedReader(新的InputStreamReader(新的FileInputStream(path))); }爪哇
问题内容: 我如何定义一个具有两个计算字段的视图,例如… …并根据前两个计算字段创建第三个计算字段,如… …? 当我按名称引用前两个计算字段时,我收到一条消息,指出字段未知。 谢谢! 问题答案: 由于视图中不允许子查询,因此您需要通过创建多个视图来模拟它们。 例如,如果直接执行此查询,将解决您的问题: 根据MySQL文档,视图在FROM子句中具有不能包含子查询的限制。要变通解决此限制并将该查询转换
我无法激活计数器++。到目前为止,s2能够读取s1,但不能计数出现的次数。如有任何帮助,我们将不胜感激。(我意识到我在错误的字符串中工作,但它帮助我首先在这里创建解决方案,然后将其发送到第二个字符串,这是不是很糟糕的逻辑?) 很抱歉问了这个愚蠢的问题,我对编程很陌生 //我需要一个扫描器来读取我所写内容,该扫描器应该计算一个字符的出现次数另一个扫描器声明的扫描器a会询问“write Somethi
问题内容: 任何人都知道如何计算这些列之一的平均值(在Linux上)? 例如:mean(第2栏) 问题答案: Awk: 读为: 对于每一行,将第2列添加到变量“总计”中。 在文件末尾,打印“总计”除以记录数。
在Ruby on Rails中,有一个特性允许您使用任何日期并打印出它是多么“久远”。 例如: 在Java有什么简单的方法可以做到这一点吗?
在 SQL 函数中计算字段 你可以把字符串表达式变量用于SQL 合计函数以在字段中进行值的计算。例如,可以将一个字段的值乘一系数来计算百分比 (如附加税或销售税)。 下列表提供了对 Northwind.mdb 数据库的 Orders (订单)及 Order Details (订货明细)表中字段进行计算的示例。 计算 示例 往字段中加一个数 Freight +5 从字段中减一个数 Freight -