因此,对于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);
}
答案 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”作为分隔符将字符串拆分为数组,然后计算数组中元素的数量。