字数逻辑

时间:2014-01-30 23:26:50

标签: c enums logic

因此,对于C类的介绍,我们必须编写一个程序来计算文件中的行数,字符数和单词数。在程序中,单词被定义为以字母开头的字母,数字和撇号序列。由于某种原因,计算单词的逻辑对我来说不起作用,也许是因为我是C的新手,或者因为我一直不善于制定逻辑。我的代码现在,传入时 hey whats up\n hey what's up\n hey wh?ts 'p\n 返回3行,31个单词,40个字符。感谢您的帮助,我知道这是一个非常蹩脚的问题,这只是让我疯了。

这是我的代码:

#include <stdio.h>
typedef enum yesno yesno;
enum yesno {
    YES,
    NO
};

int main() {
    int c;          // character
    int nl, nw, nc; // number of lines, words, characters
    yesno inword;   // records if we are in a word or not
    yesno badchar;
    // initialize variables:
    badchar=NO;
    inword = NO;
    nl     = 0;
    nw     = 0;
    nc     = 0;`

    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            inword = NO;
        else if (inword == NO) {
            inword = YES;
        }
        while (inword == YES){
            if (( c<'A' || c>'Z')||(c<'a'||c>'z')||(c<'0'|| c>'9') ){
                inword= NO;
                //badchar = YES;
            }
            if (( c<'A' || c>'Z')||(c<'a'||c>'z')|| (c<'0'|| c>'9') ||(c!=  '\'')){
                nw=nw;
                inword = NO;
                //badchar=YES;
            }
            if(badchar==NO){
                nw++;
                badchar=NO;
                inword= NO;
            }
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}

2 个答案:

答案 0 :(得分:1)

一个问题是这种情况:

if (( c<'A' || c>'Z')||(c<'a'||c>'z')||(c<'0'|| c>'9') ){
    inword = NO;

考虑c的值,例如:

  • 'A':这将小于'a',因此您将切换为inword = NO
  • 'a':这将大于'Z',因此您将切换为inword = NO
  • '0':这将小于'A',因此您将切换为inword = NO

您需要在条件集之间使用&&

if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') && (c < '0' || c > '9')){

或者,更好的是,您可以使用<ctype.h>中的宏/函数:

if (!isupper(c) && !islower(c) && !isdigit(c))

但可以缩写为:

if (!isalnum(c))

您还需要查看其他测试。可能还有其他问题,但我根本没有回顾其余的代码。

答案 1 :(得分:0)

我从来没有编程C.但是当我用其他语言编写同样的东西时,它并不太难。对于字数,将“\ n”替换为空格,然后使用空格作为分隔符将字符串拆分为数组,最后计算数组中的元素数。获取行数类似:使用“\ n”作为分隔符将字符串拆分为数组,然后计算数组中元素的数量。