C 我希望我的代码按照字符串的出现顺序打印字符的频率
我的代码是按随机顺序打印字符的频率。可以做些什么,以便它按照给定单词的顺序打印字符的频率。我目前的代码如下C 我希望我的代码按照字符串的出现顺序打印字符的频率,c,C,我的代码是按随机顺序打印字符的频率。可以做些什么,以便它按照给定单词的顺序打印字符的频率。我目前的代码如下 #include <stdio.h> #include <conio.h> void main() { char string1[50]; int i = 0, counter[26] = { 0 }; printf("\nEnter a string\n"); //Inputs a string gets(string1)
#include <stdio.h>
#include <conio.h>
void main() {
char string1[50];
int i = 0, counter[26] = { 0 };
printf("\nEnter a string\n");
//Inputs a string
gets(string1);
while (string1[i] != '\0') {
//checks and includes all the characters
if (string1[i] >= 'a' && string1[i] <= 'z') {
//counts the frequency of characters
counter[string1[i] - 'a']++;
i++;
}
}
//printing frequency of each character
for (i = 0; i < 26; i++) {
if (counter[i] != 0)
printf("%c occurs %d times.\n", i + 'a', counter[i]);
}
getch();
}
#包括
#包括
void main(){
charstring1[50];
int i=0,计数器[26]={0};
printf(“\n输入字符串\n”);
//输入一个字符串
获取(string1);
while(string1[i]!='\0'){
//检查并包含所有字符
如果(string1[i]>='a'&&string1[i]代码中有几个问题:
- 使用
获取
:此函数不安全,已从当前版本的C标准中删除
- 仅当
string1[i]
是小写字母时,才可以对i
进行递增:如果键入任何其他字符,将运行无限循环
main
的合适原型是intmain(void)
或intmain(intarc,char*argv[])
- 您只计算小写字母。
H
是大写字母,因此不计算
以下是一个改进的版本:
#include <stdio.h>
#include <ctype.h>
int main(void) {
char string1[128];
int i = 0, counter[256] = { 0 };
printf("\nEnter a string\n");
//Inputs a string
if (fgets(string1, sizeof string1, stdin) == NULL) {
// empty file: got an empty line
*string1 = '\0';
}
for (i = 0; string1[i] != '\0'; i++) {
if (isalpha((unsigned char)string1[i])) {
//counts the frequency of letters
counter[string1[i]]++;
}
}
//printing frequency of each counted character
//characters are printed in the order of appearance
for (i = 0; string1[i] != '\0'; i++) {
if (counter[string1[i]] != 0) {
printf("%c occurs %d times.\n",
string1[i], counter[string1[i]]);
counter[string1[i]] = 0; // print each letter once.
}
}
getch();
return 0;
}
#包括
#包括
内部主(空){
charstring1[128];
int i=0,计数器[256]={0};
printf(“\n输入字符串\n”);
//输入一个字符串
if(fgets(string1,string1的大小,stdin)=NULL){
//空文件:得到一个空行
*string1='\0';
}
对于(i=0;string1[i]!='\0';i++){
if(isalpha((无符号字符)string1[i])){
//计算字母的频率
计数器[string1[i]]++;
}
}
//每个计数字符的打印频率
//字符按外观顺序打印
对于(i=0;string1[i]!='\0';i++){
if(计数器[string1[i]!=0){
printf(“%c出现%d次。\n”,
string1[i],counter[string1[i]];
计数器[string1[i]]=0;//每个字母打印一次。
}
}
getch();
返回0;
}
第二次使用字符串生成输出,可以按字符的外观顺序打印字符
在“打印每个字符的频率”部分,使用代码处理输入字符串。这一次,如果频率值不为零,则打印它,然后将频率值重置为零。如果频率值为零,则必须已打印它,因此不要执行任何操作
//printing frequency of each counted character (in input order)
for (i = 0; string1[i] != '\0'; i++) {
char ch = string[i];
if (counter[ch - 'a'] != 0) {
printf("%c occurs %d times.\n", ch, counter[ch - 'a']);
counter[ch - 'a'] = 0;
}
}
您的问题有点不清楚。您的意思是,除了跳过字符串中的第一个字符外,代码工作正常吗?它没有打印字符串中第一个字符的频率。除此之外,它打印字符串中的所有字符显示一些示例输入、实际输出和预期输出。您的编辑显示代码按预期工作。输入字符串hello
包含1e
、1h
、2l
和1o
,这就是打印的内容。那么到底是什么问题?我希望它按顺序打印。第一个字符-它的出现、第二个字符它的出现、第三个字符它的出现,然后更新为代码按外观顺序打印字母,无重复。