问题描述
我也问过与此相关的计划,但现在大量的研究和用头撞我坚持......之后问题又来。
I have asked a question related to this program but now after much research and headbutting I am stuck...again.
我试图写一个程序,将用户输入并保存它,然后打印出所有的独特的单词和的时候,他们每次发生数
I am trying to write a program that will take the user input and store it then print out all the unique words and the number of times they each occurred
例如:
Please enter something: Hello#@Hello# hs,,,he,,whywhyto[then the user hits enter]
hello 2
hs 1
he 1
whywhyto 1
以上应为输出,当然whywhyto不是一个单词,而是因为我假设被任何东西分隔的任何字母图案是不是一个字母(空格不会在这种情况下无所谓,0-9 ,#$(@等)被认为是一个字。我需要,因为我不是能够使用链表我也不知道他们还没有使用二维数组。
The above should be the output, of course whywhyto isn't a word but it doesn't matter in this case because I am assuming any pattern of letters separated by anything that isn't a letter (spaces, 0-9,#$(@ etc.) is considered a word. I need to use 2D arrays because I am not capable of using linked lists nor do I understand them yet.
这是我迄今为止
#include <stdio.h>
#include <ctype.h>
int main()
{
char array[64];
int i=0, j, input;
printf("Please enter an input:");
input=fgetc(stdin);
while(input != '\n')
{
if(isalpha(input))
{
array[i]=input;
i++;
}
input=fgetc(stdin);
}
for(j=0;j<i;j++)
{
// printf("%c ",j,array[j]);
printf("%c",array[j]);
}
printf("\n");
}
我使用因而isalpha
只得到信件,但所有这确实是摆脱的东西,是不是一个字母,将其存储,然后打印回来了,但我有没有关于如何得到它来存储一次字首次出现时,然后只增加每个字计数的线索。我只能用龟etc(),这是很难至少对我来说,我只对3-4个月的Ç经验,我知道我将不得不使用2维数组,他们已经阅读了,但我一直没能对COM prehend我怎么会实现它们请帮我一下。
I am using isalpha
to get only letters but all this does is it gets rid of anything that isn't a letter, stores it and then prints back, but I have not a clue on how to get it to store words once for their first occurrence and then just increment a count for each word. I can only use fgetc() which is hard for me at least, I only have about 3-4 months of C experience, I know I will have to use 2 dimensional arrays, have been reading up on them but I have not been able to comprehend how I will implement them please help me out a bit.
推荐答案
下面是code,似乎工作:
Here is code that seems to work:
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
enum { MAX_WORDS = 64, MAX_WORD_LEN = 20 };
int main(void)
{
char words[MAX_WORDS][MAX_WORD_LEN];
int count[MAX_WORDS] = { 0 };
int w = 0;
char word[MAX_WORD_LEN];
int c;
int l = 0;
while ((c = getchar()) != EOF)
{
if (isalpha(c))
{
if (l < MAX_WORD_LEN - 1)
word[l++] = c;
else
{
fprintf(stderr, "Word too long: %*s%c...\n", l, word, c);
break;
}
}
else if (l > 0)
{
word[l] = '\0';
printf("Found word <<%s>>\n", word);
assert(strlen(word) < MAX_WORD_LEN);
int found = 0;
for (int i = 0; i < w; i++)
{
if (strcmp(word, words[i]) == 0)
{
count[i]++;
found = 1;
break;
}
}
if (!found)
{
if (w >= MAX_WORDS)
{
fprintf(stderr, "Too many distinct words (%s)\n", word);
break;
}
strcpy(words[w], word);
count[w++] = 1;
}
l = 0;
}
}
for (int i = 0; i < w; i++)
printf("%3d: %s\n", count[i], words[i]);
return 0;
}
示例输出:
$ ./wordfreq <<< "I think, therefore I am, I think, or maybe I do not think after all, and therefore I am not."
Found word <<I>>
Found word <<think>>
Found word <<therefore>>
Found word <<I>>
Found word <<am>>
Found word <<I>>
Found word <<think>>
Found word <<or>>
Found word <<maybe>>
Found word <<I>>
Found word <<do>>
Found word <<not>>
Found word <<think>>
Found word <<after>>
Found word <<all>>
Found word <<and>>
Found word <<therefore>>
Found word <<I>>
Found word <<am>>
Found word <<not>>
5: I
3: think
2: therefore
2: am
1: or
1: maybe
1: do
2: not
1: after
1: all
1: and
$ ./wordfreq <<< "I think thereforeIamIthinkormaybeI do not think after all, and therefore I am not."
Found word <<I>>
Found word <<think>>
Word too long: thereforeIamIthinkor...
1: I
1: think
$ ./wordfreq <<< "a b c d e f g h i j k l m n o p q r s t u v w x y z
> A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
> aa ab ac ad ae af ag ah ai aj ak al am
> an ao ap aq ar as at au av aw ax ay az
> "
Found word <<a>>
Found word <<b>>
Found word <<c>>
Found word <<d>>
Found word <<e>>
Found word <<f>>
Found word <<g>>
Found word <<h>>
Found word <<i>>
Found word <<j>>
Found word <<k>>
Found word <<l>>
Found word <<m>>
Found word <<n>>
Found word <<o>>
Found word <<p>>
Found word <<q>>
Found word <<r>>
Found word <<s>>
Found word <<t>>
Found word <<u>>
Found word <<v>>
Found word <<w>>
Found word <<x>>
Found word <<y>>
Found word <<z>>
Found word <<A>>
Found word <<B>>
Found word <<C>>
Found word <<D>>
Found word <<E>>
Found word <<F>>
Found word <<G>>
Found word <<H>>
Found word <<I>>
Found word <<J>>
Found word <<K>>
Found word <<L>>
Found word <<M>>
Found word <<N>>
Found word <<O>>
Found word <<P>>
Found word <<Q>>
Found word <<R>>
Found word <<S>>
Found word <<T>>
Found word <<U>>
Found word <<V>>
Found word <<W>>
Found word <<X>>
Found word <<Y>>
Found word <<Z>>
Found word <<aa>>
Found word <<ab>>
Found word <<ac>>
Found word <<ad>>
Found word <<ae>>
Found word <<af>>
Found word <<ag>>
Found word <<ah>>
Found word <<ai>>
Found word <<aj>>
Found word <<ak>>
Found word <<al>>
Found word <<am>>
Too many distinct words (am)
1: a
1: b
1: c
1: d
1: e
1: f
1: g
1: h
1: i
1: j
1: k
1: l
1: m
1: n
1: o
1: p
1: q
1: r
1: s
1: t
1: u
1: v
1: w
1: x
1: y
1: z
1: A
1: B
1: C
1: D
1: E
1: F
1: G
1: H
1: I
1: J
1: K
1: L
1: M
1: N
1: O
1: P
1: Q
1: R
1: S
1: T
1: U
1: V
1: W
1: X
1: Y
1: Z
1: aa
1: ab
1: ac
1: ad
1: ae
1: af
1: ag
1: ah
1: ai
1: aj
1: ak
1: al
$
有关'字太长和字太多的帮助测试安慰我,code是声音。制定这样的测试是很好的做法。
The test for 'word too long' and 'too many words' help reassure me that the code is sound. Devising such tests is good practice.
这篇关于如何计算使用龟etc(单词的唯一的号码),然后打印计数用C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!