我实现了这个代码以获得no。的话数。它适用于所有单个字符,即如果我输入"q w r "
作为输入,它会给我3个单词,但当我输入"qwe ed df "
作为输入时,它会显示2。
#include<stdio.h>
int main()
{
int c=getchar();
int words=0;
while(c!=EOF)
{
if(c==' ' || c=='\n')
{
c=getchar();
}
else if(c>='a' && c<='z')
{
c=getchar();
if(c==' ')
{
words=words+1;
c=getchar();
}
else
{
c=getchar();
}
}
}
printf("%i\n",words);
}
答案 0 :(得分:2)
诀窍是计算边界。
您的原始代码存在错误...
if(c==' ')
{
words=words+1;
c=getchar();
}
如果一对读取产生'a'
=&gt;,则代码仅计算单词。 'z'
后跟' '
。
诀窍是在一个时间循环中将循环简化为读取一个字符。 (这确保不会发生奇怪的边界),以及模拟您是在吃单词还是空格的状态机。
enum Mode { word = 1, spaces = 2 };
int c=getchar();
enum Mode currentMode = spaces;
int words=0;
while(c!=EOF)
{
if(c==' ' || c=='\n')
{
if( currentMode == word ) {
words=words+1;
}
currentMode = spaces;
}
else if(c>='a' && c<='z')
{
currentMode = word;
}
c=getchar();
}
// count the last word...
if( currentMode == word ) {
words=words+1;
}
代码现在将忽略任何非字母字符,既不是单词,也不是空格。
编辑:修正了错误的枚举使用
答案 1 :(得分:1)
您的代码存在的问题是您对getchar
的分散调用,这些调用隐藏了您所看到的错误。
您需要检查每个字符是否为空格以及每个字符是否为字母的内容。
类似的东西:
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n') {
} else if (c >= 'a' && c <= 'z')
} else {
}
}
现在你只需要弄清楚这些分组中的逻辑。你有正确的逻辑(如果前面的字母是一个字符,你得到一个空格,然后增加单词,否则只是继续)。但是,您对getchar
的多次调用意味着您可以错过该条件。
填写上面的空白,它应该工作。 (然后用大写字母进行测试!)。
答案 2 :(得分:1)
您正在读取while循环中太多位置的字符。这是输出错误的原因。尝试使用此循环:
while(c!=EOF)
{
while(c == ' ' || c == '\n') //consume multiple spaces
{
c = getchar();
}
for( int i=0 ;c >= 'a' && c <= 'z'; i++) //consuming a word
{
if(i == 0) //increment word count once at the start of each word
{
words++;
}
c = getchar();
}
}
答案 3 :(得分:0)
您的代码存在
字符串问题我认为偶数字符
程序的逻辑并不完全正常,你必须在最后else
内添加这个条件:
if(c==' ')
{
words=words+1;
c=getchar();
}
程序将是这样的:
#include <stdio.h>
int main()
{
int c=getchar();
int words=0;
while(c!=EOF)
{
if(c==' ' || c=='\n')
{
c=getchar();
}
else if(c>='a' && c<='z')
{
c=getchar();
if(c==' ')
{
words=words+1;
c=getchar();
}
else
{
c=getchar();
if(c==' ')
{
words=words+1;
c=getchar();
}
}
}
}
printf("%d\n",words);
return 0;
}
因为当您输入两个字符的字符串并添加空格时,最后一个空格将由getchar
语句中的最后else
读取,而content = db.StringProperty(multiline=True)
content2 = db.StringProperty(multiline=True)
语句不会增加单词的数量。
检查this results。
我希望这有帮助!