2013-07-20 5 views
1

У меня есть следующий код для подсчета вхождения каждой буквы во входной строке. Цикл while выполняется правильно. Теперь у меня есть arr[], содержащий номер 'a' в arr[0], 'b's в arr[1] и так далее.Печать каждой буквы во входном потоке

Однако, printf не отображает полное содержание arr. (Пример o/p, приведенный ниже).

Если я вообще прокомментирую петлю while, printf печатает все 26 arr[] значений отлично! Что я могу пропустить в этой простой программе?

Если какой-либо помощи, я использую VS 2008.

int arr[26]={'\0'}; 
int i = 0, c = 0, idx = 0, count = 0; 
while((c = getchar()) != EOF) { 
    if('a' <= c && 'z' >= c) { 
    idx = c - 'a'; 
    arr[idx] = arr[idx]+1; 
    } 
} 
for(count = 0; count < 26; count++) { 
    printf("arr[%d] = %d\n", count, arr[count]); 
} 

Выходы, которые я получаю (сохраняет изменения для различных входов):

abcxyz 
arr[0] = 1 
arr[1] = 1 
^CPress any key to continue . . . 

abcabc 
arr[0] = 2 
arr[1] 
^CPress any key to continue . . . 

@Nobilis: Обновленный код счет для прописных букв, а также сделал печать более значимой :)

int main() 
{ 
    int arr[26]={'\0'}; 
    int i = 0, c = 0, idx = 0, count = 0; 
    while((c = getchar()) != EOF) 
    { 
     if('a' <= c && 'z' >= c) 
     { 
      idx = c - 'a'; 
      arr[idx] = arr[idx]+1; 
     } 
     if('A' <= c && 'Z' >= c) 
     { 
      idx = c - 'A'; 
      arr[idx] = arr[idx]+1; 
     } 
    } 
    for(count = 0; count < 26; count++) 
    { 

     printf("%c or %c = %d\n", ('A'+count), ('a'+count), arr[count]); 
    } 
} 
+0

Ваша проблема в том, что не все входные символы подсчитаны? Я только что запустил ваш код с вводом 'abcabc', и я правильно получил счет:' arr [0] = 2 arr [1] = 2 arr [2] = 2'. Получаете ли вы какие-либо предупреждения (кроме неиспользованного 'i')? – Nobilis

+1

Рядом с: int arr [26] = {'\ 0'}; Ваш код совершенно верный. Вы должны искать проблему в другом месте. Для инициализации массива вы инициализируете int с char. Это совершенно легально C и работает отлично, но вы не должны привыкнуть к чему-то. – Geod24

+0

Входные символы считаются точными. Если я укажу ввод как «abcxyz», я вижу (используя отладчик VS) arr [0], arr [1], arr [2] и arr [23], arr [24], arr [25], содержащие 1. Все остальные значения arr равны 0. Но когда я пытаюсь распечатать его, я получаю следующий, неполный вывод: 'abcxzy arr [0] = 1 arr [1] = 1^CPНажмите любую клавишу для продолжения. , «. – VivereJay

ответ

2

Вы не проходя EOF правильно, на Windows, это Ctrl +Z. Кроме того, имейте в виду, что ваш алгоритм не будет принимать заглавные буквы.

+1

Добавлен код для учета заглавных букв, только потому, что он делает это полным и может помочь кому-то! – VivereJay

6

Нажми CTRL-D на linux и CTRL-Z на окнах вместо CTRL-C, когда вы хотите закончить ввод символов.

CTRL-C завершает работу программы, поэтому больше не будет выполняться обработка, и вы не увидите результат.

+0

Rohan Я использую 'CTR + C' для ключа –

+1

@Nobilis, спасибо, обновил ответ. – Rohan

+0

CTRL-D в Unix не работает как CTRL-Z в Windows. Эффект CTRL-D заключается в сигнале конца входного потока, только если он используется в начале строки или дважды в строке. http://stackoverflow.com/a/1516177/139746 –

Смежные вопросы