以下是我必须解决的练习问题,以确保cs50 pset2的可读性(从网站粘贴):
这些不是完整的说明,只是我遇到的麻烦部分。
我想出了如何计算文本中字母的数量,但是却无法弄清单词和句子的数量。我尝试过使用它来搜索并使用其他外部资源,但是弹出的只是问题的答案,坦率地说,这就像在作弊。这是我的代码:
#include<stdio.h>
#include<cs50.h>
#include<string.h>
#include<stdbool.h>
#include<ctype.h>
int main (void)
{
int letters = 0;
string text = get_string("Text: ");
int words = 0;
for (int i = 0; i < strlen(text);i++)
{
if(isalpha(text[i]) != 0)
{
letters++;
}
}
printf("Letters: %i\n", letters);
for (int i = 0; i < strlen(text);i++)
{
if (isspace(text[i]) != 0)
{
if(isalpha (text[i] + 1) != 0)
{
words++;
}
}
}
printf("Words: %i\n", words);
}
此代码计算正确的字母数,但始终键入Words:0。我还没有完成句子部分。我可以帮忙吗?如果您给我答案,您能否解释为什么会这样?
答案 0 :(得分:2)
for (int i = 0; i < strlen(text);i++)
{
if (isspace(text[i]) != 0)
{
if(isalpha (text[i] + 1) != 0)
{
words++;
}
}
}
这里有些错误。您需要做的是意识到该程序可以处于两种状态之一。您当前是否正在阅读单词。
bool reading_word = false; // Flag
int words = 0;
for(int i=0; i<strlen(text); i++) {
if(isspace(text[i]) {
reading_word = false;
}
else if(isalpha(text[i])) {
if(!reading_word) {
reading_word = true;
words++;
}
}
}
此外,请不要写if(isspace(text[i]) != 0)
。它返回一个布尔值,因此基本上可以读取“如果text [i]是空格”,那么只需写if(isspace(text[i]))
此外,在您的代码isalpha (text[i] + 1)
中是完全错误的,没有任何意义。既然这是家庭作业,我就留给你找出原因。
对于句子,您可以使用如下函数:
int isdelim(char c)
{
return c == '.' || c == '!' || c == '?';
}
,然后以与计数单词的循环类似的方式使用它。