【问题标题】:How to output a the contents of an array selectively with a IF statement如何使用 IF 语句有选择地输出数组的内容
【发布时间】:2010-10-23 17:58:05
【问题描述】:

我在从存储在数组中的 ASCII 值打印“char”时遇到了一些问题。

总体目标是读取用户输入的字符串,并将其存储在数组中。然后使用另一个数组来统计每个字符在字符串中出现的次数,将出现次数存储在与被计数字符的 ASCII 码匹配的数组地址中。然后输出出现次数以及计数的字符以及字符的百分比。

我可以成功地制作字符出现的数组。作为测试,我可以在发生计数期间进行计数和百分比计算。但后来当我尝试使用忽略 NULL 值并将数组地址打印为字符的 ASCII 值的 IF 语句创建 FOR 循环时,该字符出现的次数,以及该字符出现在总字符中的百分比。我只是打印了一个 NULL 字符。您可以在下面找到我到目前为止所写的内容。

这是对学校作业的帮助,我不是在寻求代码中的解决方案。我一直试图找出我哪里出错了,我不确定为什么我的 FOR 循环之一有效而第二个无效。并且希望能帮助我找出我哪里出错了。

#include <stdio.h>
#include <stdlib.h>
#define TERMINAL -9
int main()
{

float totalCharacters;
float currentCharacterCount;
int iteration, currentInputCharacter;
char checkCharacter, input [80];
int alphabetArray[128] = {0};

totalCharacters = 0;
iteration = 0;
currentCharacterCount = 0;
currentInputCharacter = 0;
alphabetArray[128] = 0;

printf("Enter a line of test: ");
gets(input);

printf ("FREQUENCY TABLE\n");
printf ("---------------\n");
printf ("Char Count %% of Total\n");
printf ("---- ----- ----------\n");

totalCharacters = strlen(input);

printf (" ALL %5d %9.2f%%\n", strlen(input), (totalCharacters / strlen(input)) * 100);

for ( iteration = 0; input[iteration] != '\0'; iteration++)
{
      checkCharacter = input[iteration];
      alphabetArray[checkCharacter]++;
      printf ("%4c %5d %9.2f%%\n", checkCharacter, alphabetArray[checkCharacter], ((float)alphabetArray[checkCharacter] / strlen(input)) * 100);
}

for ( iteration = 0; alphabetArray[iteration] != '\0'; iteration++)
{
     printf ("%1c ", alphabetArray[iteration]);

    if (alphabetArray[iteration] != '\0')
    {
       checkCharacter = alphabetArray[iteration];

       printf ("%4c %5d %9.2f%%\n", checkCharacter, alphabetArray[checkCharacter], ((float)alphabetArray[checkCharacter] / strlen(input)) * 100);
    }
}


system ("pause");
exit(0);

}

【问题讨论】:

  • 不知道到目前为止的答案是否对您有所帮助,但如果有,请接受最好的答案。更多关于编码风格的指示可能会帮助您编写更好的可读性和更安全的代码。不要分开初始化和声明,这里没有意义。对于所有使用无符号类型的计数器,您会遇到更少的惊喜。如果您对!= 进行显式比较,C 语言中的许多人不喜欢零值。根据定义,C 中的布尔表达式返回 01 作为值,只需使用它即可。

标签: c arrays if-statement ascii for-loop


【解决方案1】:

第二个 for 循环遍历不是字符串的 alphabetArray,因此不会以 '\0' 结尾。

最好使用只有 26 个字母的事实,并且有一个 26 长的数组。您可以通过somechar - 'a' 将字母转换为字母表中的位置,小写字母和somechar - 'A' 大写字母,但您需要检查不在“a”到“z”和“A”范围内的字符到“Z”,例如!@£$%^&amp;*().?

【讨论】:

    【解决方案2】:

    alphabetArray 是 int 类型,所以不会为 null。

    【讨论】:

      【解决方案3】:

      尝试改变这个:

      for ( iteration = 0; alphabetArray[iteration] != '\0'; iteration++) 
      { 
           printf ("%1c ", alphabetArray[iteration]); 
      
          if (alphabetArray[iteration] != '\0') 
          { 
             checkCharacter = alphabetArray[iteration]; 
      
             printf ("%4c %5d %9.2f%%\n", checkCharacter, alphabetArray[checkCharacter], ((float)alphabetArray[checkCharacter] / strlen(input)) * 100); 
          } 
      } 
      

      对此(注意:未经测试,但在正确的轨道上):

      for ( checkCharacter = 1; checkCharacter < 128; checkCharacter++) 
      { 
          putchar(checkCharacter);     
          if (alphabetArray[iteration] != 0) // If cur char has non-zero occurance count
             printf (" %4c %5d %9.2f%%\n", checkCharacter, alphabetArray[checkCharacter], ((double)alphabetArray[checkCharacter]) / strlen(input) * 100.0); 
          else
             putchar('\n');
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-31
        • 2019-12-28
        • 2017-12-02
        相关资源
        最近更新 更多