计算字符串或文件中的字符
Counting characters in a string or file
我有以下代码:
#include "stdafx.h"
#include "string.h"
#include "ctype.h"
/*selection sort*/
void swap(int A[], int j, int k)
{
int p = A[k];
int i;
for (i = 0; i < (k - j); i++)
{
A[k - i] = A[k - i - 1];
}
A[j] = p;
}
/*greatest number in an array*/
int max(int A[], int N, int k)
{
int max = k, i;
for (i = k; i < N; i++)
{
if (A[max] < A[i])
max = i;
}
return max;
}
int count_nonspace(const char* str)
{
int count = 0;
while(*str)
{
if(!isspace(*str++))
count++;
}
return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[256];
int i = 0, j = 0, count[256] = { 0 };
char string[100] = "Hello world";
for (i = 0; i < 100; i++)
{
for (j = 0; j<256; j++)
{
if (tolower(string[i]) == (j))
{
count[j]++;
}
}
}
for (j = 0; j<256; j++)
{
printf("\n%c -> %d \n", j, count[j]);
}
}
程序正在计算字符串中每个字符的出现次数。现在它打印所有 256 个字符的出现次数,而我希望它只打印字符串中出现次数最多的字符。我的想法是对具有出现次数的数组使用选择排序方法,但这不起作用,因此我的问题是如何只打印字符串中出现次数最多的字符?
如果有人有疑问,这不是我的作业题。
编辑:我刚刚注意到这段代码 printf 出现了以 "j" 开头的字符,这是为什么?
- 创建一个以您的字符为索引的数组。
- 根据读取的字符继续增加数组中的值。
- 现在从数组中获取最大值,它为您提供输入中出现次数最多的字符。
代码如下所示:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void) {
char buf[100];
int i=0,max =0,t=0;
int a[256];
memset(a,0,sizeof(a));
fgets(buf,100,stdin);
buf[strlen(buf)-1] = '[=10=]';
while(buf[i] != '[=10=]')
{
a[(int)buf[i]]++;
i++;
}
i=0;
for(i=0;i<256;i++)
{
if(a[i] > max)
{
max = a[i];
t = i;
}
}
printf("The most occurring character is %c: Times: %d",t,max);
return 0;
}
这是一个解决方案,基于您自己的解决方案,并使用 qsort()
。
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
struct Frequency
{
int character;
int count;
};
int compare(const void *const lhs, const void *const rhs)
{
return ((struct Frequency *)rhs)->count - ((struct Frequency *)lhs)->count;
}
int main(int argc, char* argv[])
{
int i = 0, j = 0;
struct Frequency count[256];
memset(&count, 0, sizeof(count));
char string[100] = "Hello world";
for (i = 0 ; i < 100 ; i++)
{
for (j = 0 ; j < 256 ; j++)
{
count[j].character = j;
if (tolower(string[i]) == j)
{
count[j].count += 1;
}
}
}
qsort(count, sizeof(count) / sizeof(*count), sizeof(*count), compare);
/* skip the '[=10=]' which was counted many times */
if (isprint(count[1].character))
printf("\nThe most popular character is: %c\n", count[1].character);
else
printf("\nThe most popular character is: \%03x\n", count[1].character);
for (j = 0 ; j < 256 ; j++)
{
if (isprint(count[j].character))
printf("\n%c -> %d \n", count[j].character, count[j].count);
else
printf("\n\%03x -> %d \n", count[j].character, count[j].count);
}
}
请注意 '[=15=]'
已为
中的所有剩余字节设置
char string[100] = "Hello world";
因此 '[=15=]'
的计数将是最高的。
您可以在计数循环中使用 strlen()
跳过 '[=15=]'
,但不要
for (i = 0 ; i < strlen(string) ; ++i) ...
这样做
size_t length = strlen(string);
for (i = 0 ; i < length ; ++i) ...
我在其他人出现之前就开始打字了,所以无论如何我都会 post。这可能是最有效的(提高效率会增加一些混乱)获得答案的方法,但它不包括忽略空格、不考虑大小写计算字符等的代码(容易修改)。
most_frequent(const char * str)
{
unsigned counts[256];
unsigned char * cur;
unsigned pos, max;
/* set all counts to zero */
memset(counts, 0, sizeof(counts));
/* count occurences of each character */
for (cur = (unsigned char *)str; *cur; ++cur)
++counts[*cur];
/* find most frequent character */
for (max = 0, pos = 1; pos < 256; ++pos)
if ( counts[pos] > counts[max] )
max = pos;
printf("Character %c occurs %u times.\n", max, counts[max]);
}
我有以下代码:
#include "stdafx.h"
#include "string.h"
#include "ctype.h"
/*selection sort*/
void swap(int A[], int j, int k)
{
int p = A[k];
int i;
for (i = 0; i < (k - j); i++)
{
A[k - i] = A[k - i - 1];
}
A[j] = p;
}
/*greatest number in an array*/
int max(int A[], int N, int k)
{
int max = k, i;
for (i = k; i < N; i++)
{
if (A[max] < A[i])
max = i;
}
return max;
}
int count_nonspace(const char* str)
{
int count = 0;
while(*str)
{
if(!isspace(*str++))
count++;
}
return count;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[256];
int i = 0, j = 0, count[256] = { 0 };
char string[100] = "Hello world";
for (i = 0; i < 100; i++)
{
for (j = 0; j<256; j++)
{
if (tolower(string[i]) == (j))
{
count[j]++;
}
}
}
for (j = 0; j<256; j++)
{
printf("\n%c -> %d \n", j, count[j]);
}
}
程序正在计算字符串中每个字符的出现次数。现在它打印所有 256 个字符的出现次数,而我希望它只打印字符串中出现次数最多的字符。我的想法是对具有出现次数的数组使用选择排序方法,但这不起作用,因此我的问题是如何只打印字符串中出现次数最多的字符?
如果有人有疑问,这不是我的作业题。
编辑:我刚刚注意到这段代码 printf 出现了以 "j" 开头的字符,这是为什么?
- 创建一个以您的字符为索引的数组。
- 根据读取的字符继续增加数组中的值。
- 现在从数组中获取最大值,它为您提供输入中出现次数最多的字符。
代码如下所示:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void) {
char buf[100];
int i=0,max =0,t=0;
int a[256];
memset(a,0,sizeof(a));
fgets(buf,100,stdin);
buf[strlen(buf)-1] = '[=10=]';
while(buf[i] != '[=10=]')
{
a[(int)buf[i]]++;
i++;
}
i=0;
for(i=0;i<256;i++)
{
if(a[i] > max)
{
max = a[i];
t = i;
}
}
printf("The most occurring character is %c: Times: %d",t,max);
return 0;
}
这是一个解决方案,基于您自己的解决方案,并使用 qsort()
。
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
struct Frequency
{
int character;
int count;
};
int compare(const void *const lhs, const void *const rhs)
{
return ((struct Frequency *)rhs)->count - ((struct Frequency *)lhs)->count;
}
int main(int argc, char* argv[])
{
int i = 0, j = 0;
struct Frequency count[256];
memset(&count, 0, sizeof(count));
char string[100] = "Hello world";
for (i = 0 ; i < 100 ; i++)
{
for (j = 0 ; j < 256 ; j++)
{
count[j].character = j;
if (tolower(string[i]) == j)
{
count[j].count += 1;
}
}
}
qsort(count, sizeof(count) / sizeof(*count), sizeof(*count), compare);
/* skip the '[=10=]' which was counted many times */
if (isprint(count[1].character))
printf("\nThe most popular character is: %c\n", count[1].character);
else
printf("\nThe most popular character is: \%03x\n", count[1].character);
for (j = 0 ; j < 256 ; j++)
{
if (isprint(count[j].character))
printf("\n%c -> %d \n", count[j].character, count[j].count);
else
printf("\n\%03x -> %d \n", count[j].character, count[j].count);
}
}
请注意 '[=15=]'
已为
char string[100] = "Hello world";
因此 '[=15=]'
的计数将是最高的。
您可以在计数循环中使用 strlen()
跳过 '[=15=]'
,但不要
for (i = 0 ; i < strlen(string) ; ++i) ...
这样做
size_t length = strlen(string);
for (i = 0 ; i < length ; ++i) ...
我在其他人出现之前就开始打字了,所以无论如何我都会 post。这可能是最有效的(提高效率会增加一些混乱)获得答案的方法,但它不包括忽略空格、不考虑大小写计算字符等的代码(容易修改)。
most_frequent(const char * str)
{
unsigned counts[256];
unsigned char * cur;
unsigned pos, max;
/* set all counts to zero */
memset(counts, 0, sizeof(counts));
/* count occurences of each character */
for (cur = (unsigned char *)str; *cur; ++cur)
++counts[*cur];
/* find most frequent character */
for (max = 0, pos = 1; pos < 256; ++pos)
if ( counts[pos] > counts[max] )
max = pos;
printf("Character %c occurs %u times.\n", max, counts[max]);
}