这是我到目前为止所提出的。
#include<stdio.h>
main()
{
int w=0, v=0, c=0, cnt=0;
char inp[21]="abcd aeiou hi there", ch;
FILE *read, *write;
write = fopen("D:/wordvowelcharacter.txt", "w");
fprintf(write, "%s", inp);
fclose(write);
read = fopen("D:/wordvowelcharacter.txt", "r");
if (read==NULL)
{
printf("Error opening file");
}
while ((ch=fgetc(read))!=EOF)
{
if (ch!=' ')
{
c++;
}
if (ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
{
v++;
}
if (ch==' ')
{
w++;
}
}
printf("Character %d Vowel %d Word %d", c, v, w);
}
- 代码结束 -
最后一个if语句是递增字数。我应该放在什么条件?当前条件给出了错误的单词数,即仅有空格数。 文件中的文字是: “abcd aeiou hi there”
答案 0 :(得分:1)
如果没有额外的要求或警告(例如,允许任何空白字符,而不仅仅是' '
,可以允许连续的空格字符等),那么公式过于简单:单词的数量是空格数加一。
答案 1 :(得分:1)
我发现您的实施存在一些问题。首先,你假设任何不是空格的东西都是字母字符。标签,换行符,标点符号等怎么样?其次,如果两个单词只用换行符分隔,那么你的代码就不会选中它,因为它只检查空格分隔的单词。
ctype.h标头提供了用于确定字符是否为空格,字母数字,标点符号等的有用函数。有关详细信息,请参阅GNU C Manual - Classification of Characters。像下面这样的东西应该产生更强大的结果。
考虑到您在其他帖子中的评论需要一个单词超过两个字符,代码变为:
#include <stdio.h>
#include <ctype.h>
int main()
{
int w=0, v=0, c=0, cnt=0;
int inword = 0;
char *inp = "hi there, w w w here's\nmore than\none line.\nAnd contractions and punctuation!";
char ch;
FILE *read, *write;
write = fopen("character.txt", "w");
fprintf(write, "%s", inp);
fclose(write);
read = fopen("character.txt", "r");
if (read==NULL)
{
printf("Error opening file");
}
while ((ch=fgetc(read))!=EOF)
{
if (isspace(ch))
{
if (inword > 2)
{
w++;
}
inword = 0;
}
else if (isalpha(ch) || ispunct(ch)) {
inword++;
if (isalpha(ch))
{
c++;
if (ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
{
v++;
}
}
}
}
if (inword > 2) w++;
printf("Character %d Vowel %d Word %d\n", c, v, w);
return 0;
}
答案 2 :(得分:0)
假设你的字符串永远不会以空格开头,最简单的方法就是将你的w增加1。
答案 3 :(得分:0)
enum status { out, in };
...
enum status stat = out;
...
while ((ch=fgetc(read))!=EOF){
if (ch!=' '){
if(stat == out)w++;
stat = in;
c++;
}
if(ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='I'||ch=='i'||ch=='O'||ch=='o'||ch=='U'||ch=='u')
{
v++;
}
if (ch==' '){
stat = out;
}
}