Как вывести содержимое массива выборочно с помощью оператора IF - PullRequest
1 голос
/ 23 октября 2010

У меня возникли проблемы с печатью "char" из значения ASCII, хранящегося в массиве.

Общая цель - прочитать строку ввода от пользователя и сохранить ее в массиве. Затем используйте другой массив, чтобы подсчитать, сколько раз каждый символ появляется в строке, сохраняя количество вхождений в адресе массива, которое соответствует коду ASCII подсчитываемого символа. Затем вывести то количество совпадений, с которым был посчитан символ, и процент символов.

Я могу успешно создать массив вхождений символов. И в качестве теста я могу делать подсчет и процентный расчет во время подсчета явлений. Но позже, когда я пытаюсь создать цикл FOR с оператором IF, который игнорирует значения NULL и печатает адрес массива в качестве значения ASCII для символа, количество встречений символа и процентное содержание этого символа от общего числа символов. Я просто напечатал символ 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);

}

Ответы [ 3 ]

2 голосов
/ 23 октября 2010

Второй цикл for выполняет итерацию по alphabetArray, который НЕ является строкой, поэтому не завершается символом \ 0.

Было бы лучше использовать тот факт, что есть только 26 букв, и иметь массив 26 длиной. Вы можете преобразовать буквы в алфавитную позицию на somechar - 'a' для строчных букв и somechar - 'A' для прописных букв, хотя вам нужно будет проверить наличие символов, которые не находятся в диапазоне от 'a' до 'z' и 'A' до 'Z', например !@£$%^&*().?.

0 голосов
/ 23 октября 2010

alphabetArray имеет тип int, поэтому он не будет нулевым.

0 голосов
/ 23 октября 2010

Попробуйте изменить это:

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');
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...