我需要制作一个程序,通过用户的输入来计算单词、句子和字母的数量。在我给出的输入是多行的之前,这个程序工作得很好。如果输入长度超过终端窗口中可容纳的文本长度,程序将开始忽略所有句号/问号/感叹号。我不知道为什么,我需要一些帮助。如果文本可以放在终端窗口的一行中,则不会发生这种情况。我还打印了程序读取的每个字符,但这也忽略了所有的句号/问号/感叹号。这些字符都不会被打印出来。为了澄清,一个句子只是句号/问号/感叹号的数量,单词的数量只是文本中空格的数量加上1。这是我的密码:
#include <stdio.h>
#include <ctype.h> //for the isalpha() function
#include <cs50.h> //for the get_string() function
int main(void)
{
int sentences = 0, letters = 0;
int words = 1;
char character;
string text = get_string("Enter Text: \n");
char x = 0;
while (text[x] != '\0')
{
character = text[x];
switch (character)
{
case ' ':
words++;
break;
case '.':
sentences++;
break;
case '?':
sentences++;
break;
case '!':
sentences++;
break;
default:
if (isalpha(character))
{
letters++;
}
}
x++;
}
printf("\n");
printf("WORDS: %d, LETTERS: %d, SENTENCES: %d\n", words, letters, sentences);
}
我对c相当陌生,但我有大约一年的Python经验。谢谢你抽出时间。
我将提出一些建议。
首先,不要使用get_string
1(或scanf
,或fgets
)。对于这样的过滤程序,实际上不需要存储输入来处理它;使用getchar
(或fgetc
)一次读取一个字符,并在此基础上循环:
int c; // getchar returns int, not char
...
puts( "Enter Text:" );
while ( ( c = getchar() ) != EOF )
{
// test c instead of text[x]
}
这种方法将处理任何长度的输入(例如,如果您将文件重定向为输入),并且它避免了在注释中发现的潜在溢出问题Weather Vane。缺点是,您必须从控制台手动发出信号EOF
以进行交互式输入(根据您的平台使用Ctrl-z或Ctrl-d)。
您可以在开关
中折叠一些测试,例如
case '.' : // Each of these cases "falls through"
case '!' : // to the following case.
case '?' :
words++; // the end of a sentence is also the end of a word
sentences++;
break;
您需要添加案例来处理换行符和制表符:
case ' ' :
case '\n' :
case '\t' :
words++;
break;
除非您不希望碰撞单词
计数器以重复空白字符,或者如果上一个非空白字符是标点符号字符。因此,您需要一个额外的变量来跟踪以前读取的字符的类:
enum {NONE, TEXT, PUNCT, WHITE} class = NONE;
...
while ( ( c = getchar() ) != EOF )
{
switch( c )
{
case ' ' :
case '\n' :
case '\t' :
if ( class == TEXT )
words++;
class = WHITE;
break;
case '.' :
case '!' :
case '?' :
if ( class == TEXT ) // Don’t bump the word counter
words++; // if the previous character was
// was whitespace or .! ?
if ( class != PUNCT ) // Don’t bump the sentence counter
sentences++; // for repeating punctuation
class = PUNCT;
break;
...
}
}
仍然会有一些奇怪的情况,这不会给出一个完全准确的计数,但对于大多数输入来说应该足够好了。
你应该能从那里找到剩下的。
get_string
)非常巧妙,但是它们严重歪曲了C实际的工作方式。typedef的string
特别令人震惊,因为它的别名不是字符串。请注意,这些工具在CS50课程之外是不可用的,所以不要过于依赖它们。我在大学上Java入门课程。我的作业是写一个程序来显示一个句子中1个字母单词的数量,一个句子中2个字母单词的数量...等等。句子是用户输入的。我应该使用一个循环,但不允许使用数组。 然而,现在只是开始,我只是想找出句子第一个单词的字母数。我得到的结果要么是字母数不正确,要么是字符串索引超出范围。 例如,当我输入“这是一个句子”时,它会给我“字符串索引超出范围:4”对此的任何帮助都将不胜感激。
我指的是学习 C 的 K 和 R 书;它是关于在字数统计程序中使用 EOF 的 while 循环,书中给出的程序运行良好,但我想知道它如何在一次输入后停止接受输入并给出带有行、单词、 请帮助我理解这个程序中到底发生了什么来打破循环。 附加代码和输出 -
以下是一个练习的说明,我必须解决cs50 pset2可读性问题(从站点粘贴副本): 你的程序应该计算文本中字母、单词和句子的数量。您可以假设字母是从a到z的任何小写字符或从a到z的任何大写字符,由空格分隔的任何字符序列都应算作一个单词,句号、感叹号或问号的任何出现都表示句子的结尾 这些不是完整的说明,只是我有问题的部分。 我知道如何计算课文中的字母数,但我不知道如何计算单词和句子。我试着用谷歌搜索
对于我的程序,我想颠倒一行文本中的字母。但是我不想颠倒句子中单词的顺序。例如,当我输入:“这是一个字符串” 我得到了一个siht 但我想要的是
我对编码相当陌生。我的“count句子”功能有问题。我将字符串与“.”进行比较,"?" , 和数一句话。无论字符串中有多少标点符号,它都只向句子计数器添加一个。我是否使用strcmp错误地获得了我想要的结果?是否有其他方法可以实现这一点?
这是我上一个问题的后续问题。已经有一个类似的问题(问题)。但我从这个答案中没有得到我想知道的东西。 从上一个问题中,我知道如果我键入很多字符,那么它们将无法用于 getchar(),直到我按 Enter 键。因此,在我按 Enter 键的那一刻,所有字符都将可用于 getchar()。现在考虑以下字符计数程序: 如果我按照以下顺序从命令行输入字符:{1,2,3,^Z,4,5,回车},然后在下一行{