使用C语言计算句子中单词和字符的数量

3

我尝试了下面的程序。

输入:我想要帮助 期望输出:单词=3 字符=9

但实际输出与期望不符。 有人能告诉我我的错误在哪里吗。

#include

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

2
如果没有\r怎么办?另外,双空格呢? - Karoly Horvath
2
我怀疑codepad是在Windows上运行的咧嘴笑 http://codepad.org/ZztFiQLU - Karoly Horvath
2
但输出错误 在函数“main”中: 对于“getche”的未定义引用 对于“getch”的未定义引用 - karthik gorijavolu
@KarolyHorvath,你是说我的程序在Turbo C上能正常运行吗? - karthik gorijavolu
2
@VijayKumar 如果你认为 main: undefined reference to getche' undefined reference to 'getch' 是你程序的输出,我猜你需要先读一本好的C编程书籍。 - Coren
显示剩余11条评论
3个回答

3
请注意:getchar() 返回的是 int 而不是 char。这是初学 C 语言编程者中最常见的陷阱之一。
此外,您应该检查特殊值 EOF 并在其出现时停止程序;这是处理读取输入的程序的典型和“干净”方式,并且可以使程序自动处理交互式输入(来自终端)和来自文件的输入。请注意保留HTML标记。

那么我需要在我的程序中做哪些修改? - karthik gorijavolu
ch 修改为 int 类型,并将 getche 替换为 getchar - Veger
好奇,为什么要担心getchar()返回一个整数?如果你有变量ch作为char类型,那么ch=getchar()会将getchar强制转换为char类型,不是吗?不需要明确地进行强制转换或其他任何操作。那么问题出在哪里呢? - Sint
getchar 返回一个 int,当你将其存储在一个 char 中时,你(可能)会丢失数据! - Veger
@Sint,你能解释一下这行代码吗?while(ch!='\r') - karthik gorijavolu
问题出在EOF上;它不是一个字符,因此需要有一个比字符更大的表示形式才能适应。否则,你会用EOF值破坏一个有效的字符,这将不太好。 - unwind

1

以下是一些你可能会发现有用的观察:
1. 你正在使用非标准函数getchgetche。请改用getchar。在这种情况下,如unwind's response中所指出的那样,你需要使用int作为返回类型。
2. 请将main的返回类型从void更改为int
3. 你没有在printf中指定格式。请添加%d说明符以打印整数。
我没有使用codepad,但ideone允许你向程序添加输入。这里是基于你在ideone上的示例的参考。
希望这可以帮助你!


1
@VijayKumar:基本上,您使用getchar()从输入中读取字符,直到遇到 '\n'。当您遇到一个<Space>字符时,也就是说空格是单词分隔符,即用<Space>分隔单词,此时您会增加单词计数器;否则,如果它不是<Space>字符,则读取的字符将被视为有效字符,并增加字符计数器。最后,当您遇到 '\n' 时,退出循环并显示计数。 - another.anon.coward
char ch='a'; while(ch!='\r') 你能解释一下这两行代码吗? - karthik gorijavolu
@karthikgorijavolu:char ch='a';ch初始化为a,而while循环是要一直运行,直到遇到\n - another.anon.coward
@karthik gorijavolu:\r 是回车,\n 是换行。您可以查找它们以了解哪个是哪个。这些链接为初学者提供了一些指导:这个那个 - another.anon.coward
我已经检查了那个链接,但没有得到这两行代码的解释: char ch='a'; while(ch!='\r') 为什么我们要用 'a' 进行初始化,并且为什么我们要运行循环直到 \r? - karthik gorijavolu
@karthikgorijavolu:你可以将 ch 初始化为任何字符,但不能是 \r,否则 while 循环不会被执行,因此它被初始化为 'a'while 循环用于读取输入,直到输入回车符 \r,这表示根据程序逻辑用户已经完成输入,程序可以显示单词和字符。 - another.anon.coward

0
#include<stdio.h>
#include<stdbool.h>

int main(void)
{
char c = '\0';
int nw = 0,nc = 0,nl = 0;

bool flag = true;
bool last = false,cur = false;

while(flag && (c = getchar())) {

    if(c != EOF)
        ++nc;
    else
        flag = false;

    if(c == '\n') nl++;

    cur = (c == EOF || c == ' ' || c == '\t' || c == '\n')?false:true;

     if(last  && !cur )
        ++nw;

    last = cur;
}


printf("\nNo of chars : %d",nc);
printf("\nNo of lines : %d",nl);
printf("\nNo of words : %d",nw);

return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接