在文件c程序中查找大写和小写字符的频率
Finding frequency of characters both upper case and lower case in a file c program
我尝试了很多东西,但是当我选择 2 来分别计算大写和小写时,结果是垃圾,我不知道这有什么问题,虽然不关心小写还是大写如果它仍然可以正常工作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i,h,k ,count[26] = {0}, nam[26] = {0};
char c[1000];
FILE *fptr;
fptr=fopen("tep1.txt","w");
if(fptr==NULL){
printf("Error!");
exit(1);
}
printf("a String please:\n");
gets(c);
fprintf(fptr,"%s",c);
fclose(fptr);
printf("discern between upper case and lower case? 0=no, 1=yes");
scanf("%d",&h);
if(h==0){
while (c[i] != '[=10=]'){
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
if (c[i]>='A' &&c[i]<='Z')
count[c[i]-'A']++;
i++;
}
for (i = 0; i < 26; i++){
if (count[i] != 0)
printf("%c %c appears %d times on file.\n",i+'a',i+'A',count[i]);
}
return 0;
}
if(h==1){
while (c[i]|c[k] != '[=10=]') {
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
i++;
if (c[k]>='A' &&c[k]<='Z')
nam[c[k]-'A']++;
k++;
}
for (i = 0; i < 26; i++){
if (count[i] != 0)
printf("%c %c appears %d times on file.\n",i+'a',count[i]);
}
for (k = 0; k < 26; k++){
if (nam[k] != 0)
printf("%c %c appears %d times on file.\n",k+'A',nam[k]);
}
return 0;
}
}
这部分代码问题比较多:
while (c[i]|c[k] != '[=10=]')
{
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
i++;
if (c[k]>='A' &&c[k]<='Z')
nam[c[k]-'A']++;
k++;
}
你不需要两个计数器;您只需要 count
和 nam
这两个数组。解析每个字母的循环结构应该相同。
从代码中退一步,想想你的循环结构应该做什么。 无论是否注意大小写,都应该以同样的方式遍历该行的字符。
顺便提一下,while
语句中的逻辑是错误的。如果你想要 c[i] 和 c[k] 的任何东西,你会想要
while (c[i] != '[=11=]' && c[k] != '[=11=]')
您的代码所做的是按位或 c[i]
和 c[k]
的值,并查看它们是否等于 '[=17=]'
,即等于 0。直到i
和 k
都指向一个空字符,这在很长一段时间内不会发生。但同样,循环遍历该行的 while 循环应该与 h == 0
情况下相同。
据我所知,您在任何地方都不需要 k
计数器。
- 首先,你必须像
i = 0
. 这样初始化你的整数
- 第二件事是计算大写和小写,问题出在printing.In打印函数中,您已经编写了两次 %c 和一次 %d,但只给出了两个参数。
只需替换您的 printf 函数,
printf("%c %c appears %d times on file.\n",i+'a',count[i]);
到
printf("%c appears %d times on file.\n",i+'a',count[i]);
你的问题就迎刃而解了。
我尝试了很多东西,但是当我选择 2 来分别计算大写和小写时,结果是垃圾,我不知道这有什么问题,虽然不关心小写还是大写如果它仍然可以正常工作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int i,h,k ,count[26] = {0}, nam[26] = {0};
char c[1000];
FILE *fptr;
fptr=fopen("tep1.txt","w");
if(fptr==NULL){
printf("Error!");
exit(1);
}
printf("a String please:\n");
gets(c);
fprintf(fptr,"%s",c);
fclose(fptr);
printf("discern between upper case and lower case? 0=no, 1=yes");
scanf("%d",&h);
if(h==0){
while (c[i] != '[=10=]'){
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
if (c[i]>='A' &&c[i]<='Z')
count[c[i]-'A']++;
i++;
}
for (i = 0; i < 26; i++){
if (count[i] != 0)
printf("%c %c appears %d times on file.\n",i+'a',i+'A',count[i]);
}
return 0;
}
if(h==1){
while (c[i]|c[k] != '[=10=]') {
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
i++;
if (c[k]>='A' &&c[k]<='Z')
nam[c[k]-'A']++;
k++;
}
for (i = 0; i < 26; i++){
if (count[i] != 0)
printf("%c %c appears %d times on file.\n",i+'a',count[i]);
}
for (k = 0; k < 26; k++){
if (nam[k] != 0)
printf("%c %c appears %d times on file.\n",k+'A',nam[k]);
}
return 0;
}
}
这部分代码问题比较多:
while (c[i]|c[k] != '[=10=]')
{
if (c[i] >= 'a' && c[i] <= 'z')
count[c[i]-'a']++;
i++;
if (c[k]>='A' &&c[k]<='Z')
nam[c[k]-'A']++;
k++;
}
你不需要两个计数器;您只需要 count
和 nam
这两个数组。解析每个字母的循环结构应该相同。
从代码中退一步,想想你的循环结构应该做什么。 无论是否注意大小写,都应该以同样的方式遍历该行的字符。
顺便提一下,while
语句中的逻辑是错误的。如果你想要 c[i] 和 c[k] 的任何东西,你会想要
while (c[i] != '[=11=]' && c[k] != '[=11=]')
您的代码所做的是按位或 c[i]
和 c[k]
的值,并查看它们是否等于 '[=17=]'
,即等于 0。直到i
和 k
都指向一个空字符,这在很长一段时间内不会发生。但同样,循环遍历该行的 while 循环应该与 h == 0
情况下相同。
据我所知,您在任何地方都不需要 k
计数器。
- 首先,你必须像
i = 0
. 这样初始化你的整数
- 第二件事是计算大写和小写,问题出在printing.In打印函数中,您已经编写了两次 %c 和一次 %d,但只给出了两个参数。
只需替换您的 printf 函数,
printf("%c %c appears %d times on file.\n",i+'a',count[i]);
到
printf("%c appears %d times on file.\n",i+'a',count[i]);
你的问题就迎刃而解了。