在文件c程序

时间:2016-02-25 06:55:59

标签: c algorithm uppercase lowercase

我尝试了很多东西,但是当我选择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;
  }
}

2 个答案:

答案 0 :(得分:2)

  • 首先,您必须初始化整数,例如i = 0
  • 第二件事是计数大写和小写,问题是在打印。在打印功能中你写了%c两次和一%%d,但只给出两个参数。
  • 只需将函数替换为

    即可

    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++;
}

你不需要两个柜台;您只需要两个数组countnam。解析每个字母的循环结构应该是相同的。

从代码中退一步,想一想你的循环结构应该做什么。 无论你是否注意案例,你应该以同样的方式遍历该行的字符。

顺便说一下,while语句中的逻辑是错误的。如果你想要c [i]和c [k]的任何东西,你会想要

while (c[i] != '\0' && c[k] != '\0')

您所做的代码是按位 - 或c[i]c[k]的值,并查看它们是否等于'\0',即等于0.直到ik都指向空字符,这很长时间都不会发生。但同样,遍历该行的while循环应与h == 0情况中的相同。

据我所知,您不需要在任何地方使用k计数器。