2016-04-27 2 views
-2

Я написал программу для вычисления частоты символов в строке, введенной пользователем. Он дает правильный вывод для всех строчных букв, но он не работает для букв верхнего регистра. Не удается найти ошибку в коде:Вычисление частоты символов в строке с помощью C

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, count[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while(string[c] != '\n') { 
     c++; 
    } 
    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
     count[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
     count[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (count[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',count[c]); 
    } 

    return 0; 
} 

Пожалуйста, помогите!

Вот скриншот. Надеюсь, вы поймете, что проблема я столкнулся:

enter image description here

Это не считая заглавные буквы.

+3

'While (строка [с] =«\ п ') 'является рискованным. Что делать, если пользователь вводил более 100 символов? –

+3

Я не могу воспроизвести вашу проблему - она ​​отлично работает для меня. –

+1

Здесь тоже отлично работает. – totoro

ответ

2

Он отлично работает, но выход может вас смутить!

Для входной строки «Foo», выход заключается в следующем:

f occurs 1 times in the entered string. 
o occurs 2 times in the entered string. 

Нижний и верхний регистр подсчитываются вместе, так что вы не видите «F происходит 1 раз».

http://ideone.com/ACJnPD

+0

Спасибо! Ваш код показал мне, что я делаю неправильно. –

+0

@BitanBasak Могу ли я спросить, что вы обнаружили, было неправильно? – totoro

3

Единственный вопрос, который я вижу границы ...

EDIT

Это может быть полностью пропущен, так как fgets() обеспечивает косую '\0' и вы справляетесь '\n' грациозно позже в чеках.

while(string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

Для удаления '\n' должно быть

while(string[c] && string[c] != '\n') { 
    c++; 
} 
string[c] = '\0'; 

и

while (string[c] != '\0') 

хорошо из-за семантики fgets().

+4

'while (c <100 && string [c]! = '\ 0')' не требуется. 'string [c]! = '\ 0'' достаточно. 'string []' будет пустым символом, если 'fgets()' не возвращает 'NULL' – chux

+0

@chux Я не знал об этом' fgets() '. – totoro

+2

Угловой регистр: когда 'stdin' закрыт,' fgets() 'может возвращаться с' string [] ', содержащим менее 100 символов, и в нем отсутствует' '\ n''. В этом случае строка '[c] = '\ 0';' является проблемой. Интересно, что код не нужен, чтобы вырвать потенциальный конечный '' \ n''. – chux

0

IGuessing, что проблема заключается в отдельный подсчет верхний и нижний регистр символа вы можете использовать различные массивы для подсчета частот:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char string[100]; 
    int c = 0, countLower[26] = {0}; 
    int countUpper[26] = {0}; 

    printf("Enter a string\n"); 
    fgets(string,100,stdin); 

    while((string[c] != '\0') && (string[c] != '\n')) { 
     c++; 
    } 

    string[c] = '\0'; 
    c = 0; 

    while (string[c] != '\0') 
    { 
     /** Considering characters from 'a' to 'z' only 
      and ignoring others */ 

     if (string[c] >= 'a' && string[c] <= 'z') 
      countLower[string[c]-'a']++; 
     else if(string[c] >= 'A' && string[c]<= 'Z') 
      countUpper[string[c]-'A']++; 

     c++; 
    } 

    for (c = 0; c < 26; c++) 
    { 
     /** Printing only those characters 
      whose count is at least 1 */ 

     if (countLower[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'a',countLower[c]); 
     if (countUpper[c] != 0) 
     printf("%c occurs %d times in the entered string.\n",c+'A',countUpper[c]); 
    } 

    return 0; 
} 
Смежные вопросы