Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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,我写了这个程序,它打开一个文本文件,里面写着一些东西,将每个单词添加到一个字符串中,查找每个单词的频率,提供搜索以某个字母开头或结尾的单词的能力,将每个单词的第一个字母和最后一个字母大写,并将它们打印到另一个文本文件(如字典)上 我只想让它再做一件事,它已经完成了,但我不知道该怎么做!我希望它能找到字母表中每个字母的频率,从大到小排序,然后,当用户输入一个字母时,它会打印出它的频率 我尝试了一些你可以在下面看到的东西,但它似乎不起作用 #include <stdio.h> #incl

我写了这个程序,它打开一个文本文件,里面写着一些东西,将每个单词添加到一个字符串中,查找每个单词的频率,提供搜索以某个字母开头或结尾的单词的能力,将每个单词的第一个字母和最后一个字母大写,并将它们打印到另一个文本文件(如字典)上

我只想让它再做一件事,它已经完成了,但我不知道该怎么做!我希望它能找到字母表中每个字母的频率,从大到小排序,然后,当用户输入一个字母时,它会打印出它的频率

我尝试了一些你可以在下面看到的东西,但它似乎不起作用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

int main(){
    FILE *fp1, *fp2;
    char buffer[100];
    char *text;
    char *word;
    char *words[N];
    char temp[N];
    char ch1,ch2,ch3;
    char alphabet[26];
    char temp2, temp3;
    int i=0, y=0, c=0;;
    int word_number=0;
    int n=0;
    int *freq;
    int freq1=0;
    int compare=0;
    int last_letter=0;
    int letter_count[256]={0};
    int temp1=0;

    fp1 = fopen("text.txt", "r");
    fp2 = fopen("output.txt", "w");

    if(fp1==NULL){exit(1);
    }

    while(fgets(buffer,100,fp1)!=NULL){
        if(i==0){
            text=(char*)malloc(strlen(buffer)+1);
            strcpy(text, buffer);
        }
        else{
            text=(char*)realloc(text,n+1+strlen(buffer));
            if(text!=NULL){
                strcat(text,buffer);
            }
            else{
                free(text);
            }
        }
        n=n+1+strlen(buffer);
        i++;
    }
    i=0;

    word=strtok(text," \"\n\t\r,.-;!");
    while(word!=NULL){
        strcpy(words[i],word); i++; word_number++;
        printf("%s\n",word);
        word=strtok(NULL," \"\n\t\r,.-;!");
    }

    for(i=0;i<word_number;i++){   //frequency of words
        y=0;
        while(y<word_number){
            compare=strcmp(words[i],words[y]);
            if(compare==0){ freq1++;
            }
            compare=0;
            y++; 
        }
        freq=(int*)malloc(sizeof(int)*word_number);
        strcpy(freq[i],freq1); freq1=0;
    }

    for(i=0;i<word_number;i++){
        printf("The word: %s ,appears %d times!\n", words[i], freq[i]);
    }

    printf("Search all words starting with the letter: ");
    scanf("%c", &ch1);                                   
    for(i=0;i<word_number;i++){
        if(words[i][0]==ch1){
            printf("%s , ", words[i]);
        }

    }

    printf("Search all words ending with the letter: ");
    scanf("%c", &ch2);
    for(i=0;i<word_number;i++){
        last_letter=strlen(words[i]);
        if(words[i][last_letter]==ch2){
            printf("%s , ", words[i]);
        }
        last_letter=0;
    }

    for(c=0;c<26;c++){  //here starts the part i need help with
        if(words[c]>='a' && words[c]<='z'){
            letter_count[words[c]-'a']++;
        }
    }

    for(c=0;c<26;c++){
        alphabet[c]=c+'a';
    }

    for(i=0;i<26;i++){     
        for(y=i+1;y<26;y++){
            if(letter_count[i]>letter_count[y]){
                temp1=letter_count[i];
                letter_count[i]=letter_count[y];
                letter_count[y]=temp;

                temp2=alphabet[i];
                alphabet[i]=alphabet[y];
                alphabet[y]=temp2;
            }
        }
    }

    printf("Type a letter to see its frequency: ");
    scanf("%c", &ch3);
    for(c=0;c<26;c++){
        if(alphabet[c]==ch3){
            temp3=c;
        }
    }
    printf("The letter '%c' appears %d times!", alphabet[temp3], letter_count[temp3]); //the part ends here

    for(i=0; i<word_number-1;i++){   //sorting words alphabetically
        for(y=i+1;y<word_number;y++){
            if(strcmp(words[i], words[y])>0){
                strcpy(temp,words[i]);
                strcpy(words[i],words[y]);
                strcpy(words[y],temp);
            }
        }
    }

    for(i=0;i<word_number;i++){        //printing words to second file
        words[i][0]=toUpper(words[i][0]);
        last_letter=strlen(words[i]); 
        words[i][last_letter]=toUpper(words[i][last_letter]);
        last_letter=0;
        fprintf(fp2,"%s\n", words[i]);
    }

    fclose(fp1);
    fclose(fp2);
    return 0;
}
#包括
#包括
#包括
#定义N 100
int main(){
文件*fp1,*fp2;
字符缓冲区[100];
字符*文本;
字符*字;
字符*字[N];
字符温度[N];
char ch1、ch2、ch3;
字符字母表[26];
字符temp2,temp3;
int i=0,y=0,c=0;;
int word_number=0;
int n=0;
int*freq;
int freq1=0;
int比较=0;
int最后一个字母=0;
整数字母_计数[256]={0};
int temp1=0;
fp1=fopen(“text.txt”,“r”);
fp2=fopen(“output.txt”,“w”);
如果(fp1==NULL){exit(1);
}
while(fgets(缓冲区,100,fp1)!=NULL){
如果(i==0){
text=(char*)malloc(strlen(buffer)+1);
strcpy(文本,缓冲区);
}
否则{
text=(char*)realloc(text,n+1+strlen(buffer));
如果(文本!=NULL){
strcat(文本、缓冲区);
}
否则{
免费(文本);
}
}
n=n+1+strlen(缓冲器);
i++;
}
i=0;
word=strtok(文本“\”\n\t\r、.-;!”;
while(word!=NULL){
strcpy(单词[i],单词);i++;单词+数字++;
printf(“%s\n”,word);
word=strtok(空,“\”\n\t\r,.-;!”;
}

对于(i=0;i当做任何涉及计数和“简单”频率分析的事情时,会想到一种基于直方图的方法

这看起来比应该的麻烦多了。只需将
str
替换为指向字符串数据的指针,就可以计算字符的实例数

当常量或预处理器宏更好时,您似乎使用了很多sentinel值。这是可以改进的

<>最后,考虑将你的代码重新分解成下面的例子中的小函数。它使阅读变得更容易,并且如果以后在StAdvExcel上发布问题,它可以让你从非工作代码中分离工作代码,这样你可以发布较小的例子,得到更多更好的响应。
代码清单

编辑

根据所提供的注释,您应该考虑在<代码> ISALPH()中添加第二个计数器。

block of code。我的检查统计ASCII字符的总数,但不统计字母的总数,因此统计数字的含义可能与您所追求的不同。

TL;DR这是大量代码,查找字母的频率通常不需要这么大的程序。加载
strcpy
s会降低代码的速度拥有sa和大量的
for
循环,这些循环实际上可以放入一个相当大但更有效的循环中。最好不要每次需要声明一些变量时都写
char
int
。只需说
char a,b,c
,然后放一个反斜杠并在新行继续声明即可。@F奥克布鲁:你的大部分评论都是错误的建议。如果这是认真的话,你真的应该得到一个新的编码风格指南。我建议用相关名称在不同的函数中编写一些功能,而不是用意大利面代码main@Olaf事实上,我不是专业的程序员,我甚至都不教C或C++。我自学成才,不幸的是,我没有任何编码风格指南:(取决于你希望频率代表什么,你可能希望
pHist->sum++;
CreateHistogram()
isalpha()
测试中(所以它是所有字母字符的总和)。或者,您可以添加第二个计数器(现有的计数器用于所有字符,测试中的第二个计数器用于所有字母的计数)。
/*******************************************************************************
 * Preprocessor directives
 ******************************************************************************/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define ALPHABET_SIZE   (26)

/*******************************************************************************
 * Abstract data types
 ******************************************************************************/
typedef struct histo_t {
    int statistics[ALPHABET_SIZE];  // Bins for storing sums
    int sum;    // In for scaling/normalizing operations
} histo_t;

/*******************************************************************************
 * Function prototypes
 ******************************************************************************/
int CreateHistogram(const char* str, histo_t* pHist);
void PrintHistogram(const histo_t* pHist);

/*******************************************************************************
 * Function definitions
 ******************************************************************************/
/*----------------------------------------------------------------------------*/
int main(void)
{
    char str[] = "Hello world. This is a test. ABCDEFGHIJKLMNOPQRSTUVWXYZ. abcdefghijklmnopqrstuvwxyz.\n";

    // Create histogram, initialize to zero
    histo_t myHistogram = { 0 };

    // Generate frequency statistics
    if ( CreateHistogram(str, &myHistogram) == 0 )
    {
        printf("Successfully generated histogram.\n");
    }
    else
    {
        printf("Couldn't generate histogram. Aborting.\n");
    }

    // Print out results
    PrintHistogram(&myHistogram);

    return 0;
}

/*----------------------------------------------------------------------------*/
int CreateHistogram(const char* str, histo_t* pHist)
{
    if ( !str || !pHist )
    {
        printf("Invalid input.\n");
        return (-1);
    }

    int i;
    for ( i = 0; i < strlen(str); i++ )
    {
        if ( isalpha(str[i]) )
        {
            int idx = tolower(str[i]) - 'a';
            pHist->statistics[idx]++;
        }
        pHist->sum++;
    }

    return 0;
}

/*----------------------------------------------------------------------------*/
void PrintHistogram(const histo_t* pHist)
{
    if ( !pHist )
    {
        printf("Invalid input.\n");
        return;
    }
    if ( pHist->sum == 0 )
    {
        printf("Empty histogram.\n");
    }

    // Print out results
    int i;
    for ( i = 0; i < ALPHABET_SIZE; i++ )
    {
        printf("%c - Count:%d - Frequency:%3.4lf%%\n",
                'a' + i, pHist->statistics[i], 100.0 * (double)pHist->statistics[i] / (double)pHist->sum);
    }
    printf("Total characters:%d\n", pHist->sum);
}
Successfully generated histogram.
a - Count:3 - Frequency:3.5294%
b - Count:2 - Frequency:2.3529%
c - Count:2 - Frequency:2.3529%
d - Count:3 - Frequency:3.5294%
e - Count:4 - Frequency:4.7059%
f - Count:2 - Frequency:2.3529%
g - Count:2 - Frequency:2.3529%
h - Count:4 - Frequency:4.7059%
i - Count:4 - Frequency:4.7059%
j - Count:2 - Frequency:2.3529%
k - Count:2 - Frequency:2.3529%
l - Count:5 - Frequency:5.8824%
m - Count:2 - Frequency:2.3529%
n - Count:2 - Frequency:2.3529%
o - Count:4 - Frequency:4.7059%
p - Count:2 - Frequency:2.3529%
q - Count:2 - Frequency:2.3529%
r - Count:3 - Frequency:3.5294%
s - Count:5 - Frequency:5.8824%
t - Count:5 - Frequency:5.8824%
u - Count:2 - Frequency:2.3529%
v - Count:2 - Frequency:2.3529%
w - Count:3 - Frequency:3.5294%
x - Count:2 - Frequency:2.3529%
y - Count:2 - Frequency:2.3529%
z - Count:2 - Frequency:2.3529%
Total characters:85