Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中省略双空格和标点符号的单词计数程序_C - Fatal编程技术网

C语言中省略双空格和标点符号的单词计数程序

C语言中省略双空格和标点符号的单词计数程序,c,C,我正在学习一门C编程基础课程,有人给我一个任务,让我创建一个计算句子中单词数的程序,我已经做到了,但是我还有一个次要任务,阻止程序计算标点符号,除此之外,如果我连续键入空格,我需要程序忽略它,我不知道如何避开它。谁能给我指出正确的方向,我不是在找人为我写代码 这是我的密码: #include <stdio.h> int main() { const char end = '.'; int words = 1; printf("please enter a se

我正在学习一门C编程基础课程,有人给我一个任务,让我创建一个计算句子中单词数的程序,我已经做到了,但是我还有一个次要任务,阻止程序计算标点符号,除此之外,如果我连续键入空格,我需要程序忽略它,我不知道如何避开它。谁能给我指出正确的方向,我不是在找人为我写代码

这是我的密码:

#include <stdio.h>
int main()
{
    const char end = '.';
    int words = 1;
    printf("please enter a sentence: \n");
    char c = getchar();
    while (c != end)
    {
        c = getchar();
        if (c == ' ')
            words++;
    }
    printf("the total number of words is %d", words);
    getchar();
    getchar();
}
#包括
int main()
{
const char end=';
int字=1;
printf(“请输入一个句子:\n”);
char c=getchar();
while(c!=结束)
{
c=getchar();
如果(c='')
words++;
}
printf(“总字数为%d”,字数);
getchar();
getchar();
}

根据您给出的代码(即通过查找分隔空间来计算单词),您可以通过记住最后一个字符忽略后续空格来解决多空格问题

    while (c != end)
    {
        c = getchar();
        if (c == ' ' && previous_c != ' ')
                words++;
        previous_c = c;
    }
但请注意,如果用户以单个空格开始输入,则程序仍将将其计为一个单词。为防止出现这种情况,您应将
previous_c
初始化为某个已知值(例如
0
),并检查是否存在这种情况。这意味着如果条件将变为(c=''&(previous|c!=''| previous|c==0))

正如Cool Guy评论的那样,您显示的程序已经忽略了标点符号


作为另一项改进,我建议使用
do…while
循环,而不是
while
循环,以减少从给定代码调用
getchar()
的位置(即通过查找分隔空间来计算单词),通过记住最后一个字符而忽略后续空格,可以解决多空格问题

    while (c != end)
    {
        c = getchar();
        if (c == ' ' && previous_c != ' ')
                words++;
        previous_c = c;
    }
但请注意,如果用户以单个空格开始输入,则程序仍将将其计为一个单词。为防止出现这种情况,您应将
previous_c
初始化为某个已知值(例如
0
),并检查是否存在这种情况。这意味着如果条件将变为(c=''&(previous|c!=''| previous|c==0))

正如Cool Guy评论的那样,您显示的程序已经忽略了标点符号


作为另一项改进,我建议使用
do…while
循环而不是
while
循环,以减少需要调用
getchar()
的位置。我将它分成两个循环。一个用于跳过所有非单词字符,另一个用于跳过单词字符。在这些循环之间,开始一个单词并将被计数

#include <stdio.h>
int main()
{
  char c;
  int words = 0;
  printf("please enter a sentence: \n");
  for(;;) {
    while((c=getchar())!=EOF && !isalpha(c));
    if(c==EOF) break;
    words++;
    while((c=getchar())!=EOF && isalpha(c));
    if(c==EOF) break;
  }
}
#包括
int main()
{
字符c;
int字=0;
printf(“请输入一个句子:\n”);
对于(;;){
而((c=getchar())!=EOF&&!isalpha(c));
如果(c==EOF)中断;
words++;
while((c=getchar())!=EOF&&isalpha(c));
如果(c==EOF)中断;
}
}

我会把它分成两个循环。一个用于跳过所有非单词字符,另一个用于跳过单词字符。在这些循环之间,开始一个单词并将被计数

#include <stdio.h>
int main()
{
  char c;
  int words = 0;
  printf("please enter a sentence: \n");
  for(;;) {
    while((c=getchar())!=EOF && !isalpha(c));
    if(c==EOF) break;
    words++;
    while((c=getchar())!=EOF && isalpha(c));
    if(c==EOF) break;
  }
}
#包括
int main()
{
字符c;
int字=0;
printf(“请输入一个句子:\n”);
对于(;;){
而((c=getchar())!=EOF&&!isalpha(c));
如果(c==EOF)中断;
words++;
while((c=getchar())!=EOF&&isalpha(c));
如果(c==EOF)中断;
}
}

“停止程序计算标点”——但你的程序还没有!而
c
应该是
int
,而不是
char
。如果你记得前面的字符,你可以知道单词的开始和结束时间。与其寻找空格,不如寻找字母。一种可能的方法是保留一个“status”变量,指示当前是否在单词中。如果在一个单词中,则空格分隔该单词,如果不在单词中,则忽略空格。读取任何其他字符时,应将状态变量设置为true。读取空格时,应将状态变量设置为false。当前算法存在逻辑缺陷,实际上,大多数情况下,
结束一个字,但该字不会被计数。要让程序在用户输入另一个键之前保持终端打开,请使用
getchar();getchar()
不会执行此任务:而是使用:
int ch;而((ch=getchar())!=EOF&&'\n'!=ch);getchar()“停止程序计算标点”——但你的程序还没有!而
c
应该是
int
,而不是
char
。如果你记得前面的字符,你可以知道单词的开始和结束时间。与其寻找空格,不如寻找字母。一种可能的方法是保留一个“status”变量,指示当前是否在单词中。如果在一个单词中,则空格分隔该单词,如果不在单词中,则忽略空格。读取任何其他字符时,应将状态变量设置为true。读取空格时,应将状态变量设置为false。当前算法存在逻辑缺陷,实际上,大多数情况下,
结束一个字,但该字不会被计数。要让程序在用户输入另一个键之前保持终端打开,请使用
getchar();getchar()
不会执行此任务:而是使用:
int ch;而((ch=getchar())!=EOF&&'\n'!=ch);getchar()