我尝试了很多东西,但是当我选择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] != '\0'){
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] != '\0') {
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;
}
}
答案 0 :(得分:2)
i = 0
。只需将
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]);
您的问题将得到解决。
答案 1 :(得分:1)
这部分代码存在很多问题:
while (c[i]|c[k] != '\0')
{
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] != '\0' && c[k] != '\0')
您所做的代码是按位 - 或c[i]
和c[k]
的值,并查看它们是否等于'\0'
,即等于0.直到i
和k
都指向空字符,这很长时间都不会发生。但同样,遍历该行的while循环应与h == 0
情况中的相同。
据我所知,您不需要在任何地方使用k
计数器。