我试图在一个字符串中找到字符频率,我写了下面的代码,但它没有显示任何输出。所有我尝试的是用各自的计数填充字符数组。
当我尝试调试时,它会提供一些输出,但会输出一些垃圾值。
#include<stdio.h>
/* Program for printing character frequency in string */
charcount(char *,int *);
int main()
{
int n,i=0;
printf("Enter n :");
scanf("%d",&n);
char var[n];
int count[100]; // array for storing character frequency
printf("Enter string :");
fflush(stdin);
scanf("%s",var);
charcount(var,count); // calling frequeny function
for(i=0;i<strlen(count);i++)
{
printf("%d\n",count[i]);
}
getch();
return 0;
}
charcount(char *p,int *q)
{
for(;*p;p++)
{
q[*p]++;
}
}
答案 0 :(得分:6)
您的代码中几乎没有问题:
count
数组未初始化。
您正在对整数数组应用strlen()。
count数组应为256(count[256]
)以覆盖所有可能的ascii字符。例如,如果您的输入为abcd
,那么当d
为100时,您将超出数组范围。
您正在打印错误的计数:
printf("%d\n",count[i]);
应为printf("%d\n",count[var[i]]);
为charcount()声明适当的原型。
修好后:
#include<stdio.h>
/* Program for printing character frequency in string */
void charcount(char *,int *);
int main()
{
int n,i=0;
printf("Enter n :");
scanf("%d",&n);
char var[n];
int count[256]={0}; // array for storing character frequency
printf("Enter string :");
scanf("%s",var);
charcount(var,count); // calling frequeny function
for(i=0;i<strlen(var);i++)
{
printf("%d\n",count[var[i]]);
}
return 0;
}
void charcount(char *p,int *q)
{
for(;*p;p++)
{
q[*p]++;
}
}
确保在C99或C11(例如gcc -std=c99 file.c
)模式下进行编译,因为早期的C标准不支持VLA。
答案 1 :(得分:2)
您需要初始化count
数组。否则,默认情况下它将包含垃圾值。您可以将整个数组初始化为0
,如下所示:
int count[100] = {0};
答案 2 :(得分:1)
int count
只是一个散列图
您的代码不适用于此字符串“abcd”
count['a'] = val // Works fine ASCII value of a is 97
count['b'] = val // Works fine ASCII value of a is 98
count['c'] = val // Works fine ASCII value of a is 99
count['d'] = val ; // Undefined Behaviour ASCII value of d is 100
大小应等于ASCII设定长度
int count[128] = {};
答案 3 :(得分:1)
您的count
数组可能不足以容纳所有可打印的值(即使假定为ASCII),并且它应该初始化为0。您的for
循环应检查var
的长度,而不是count
,因为您无法明智地将计数整数数组视为字符串。
int count[1<<CHAR_BIT] = {};
/*...*/
for(i=0;i<strlen(var);i++)
{
printf("%d\n",count[var[i]]);
}
嗯,这实际上取决于你想要输出的内容。如果您打算输出所有count
,那么:
for(i=0;i<sizeof(count)/sizeof(count[0]);i++)
{
printf("%d\n",count[i]);
}
答案 4 :(得分:0)
JAVA程序打印“ *”的次数与String中字符出现的次数相同。 或char_in_String:char_in_String的频率 代替*您可以打印频率计数
public class CharFreq
{
public static void main(String[] args)
{
String s = "be yourself "; System.out.println(s);
int r=0;
char[] str = s.toCharArray();
for (int i = 0; i < str.length; i++)
{
int cnt = 0;
if (str[i] != ' ')
{
for (int j = 0; j < str.length; j++)
{
if (str[i] == str[j])
{
cnt++; r=j;
}
}
if(i==r)
{
System.out.print(str[i] + ":");
for (int k = 1; k <=cnt; k++)
System.out.print("*");
System.out.println();
}
}
}
}
}
输出: 做你自己 b:* y:* o:* 你:* r:* s:* e:** l:* f:*
答案 5 :(得分:-1)
您的count[100]
不够大。假设你只输入“A - Z”或“a - z”它仍然不够大,因为'z'是122,那么你的charcount会增加计数[122]。
您应该考虑将int count[100]
更改为int count[128] = { 0 }