Bill the eternal Ответов: 2

For statement не работает так, как я хотел в моей программе на языке Си


Я видел простую программу на языке Си, которая подсчитывает, сколько раз каждая цифра от 0 до 9 появляется в тексте. Это звучит так:
#include stdio.h

int main(void)
{
    int c, i, nwhite, nother;
    int ndigit[10]
    nwhite = nother = 0;
    for (i=0; i<10; ++i)
    {
        ndigit[i]=0;
    }
    while ((c = getchar()) != EOF )
    {
        if (c>='0' && c<='9')
            ++ndigit[c-'0'];
        else if (c==' ' || c =='\t' || c=='\n')
            ++nwhite;
        else
            ++nother;
     }
     printf("digits =");
     for (i = 0; i < 10; ++i)
          printf("%d ", ndigit[i]);
     printf(", white space is %d, other is %d\n", nwhite, nother);
     return 0;
 }

Я использую Dev-C 5.11 в своей Windows XP.Он компилируется без проблем, но когда я пытаюсь запустить его, он не показывает всех результатов, которые должен. Он печатает первые 4 или 5 элементов массива (но никогда не одинаковое их количество, даже если я пишу точно такие же слова) и вообще не печатает пробелы и другие вещи. После тестирования я понял, что если я поставлю последний for, тот, который печатает элементы массива ndigit, то остальная часть программы будет работать без ошибок.

Вы знаете, почему это происходит?

Что я уже пробовал:

Я пробовал менять for с while, и результаты были те же. Однажды это сработало нормально, но когда я снова набрал те же самые слова, это не сработало.Он печатает только первые 5 или 6 элементов ndigit.

Jochen Arndt

После исправления ошибок, которые приводят к ошибкам компиляции, он отлично работает при компиляции с GCC на Ubuntu (Dev-C тоже использует GCC).

Ошибки заключаются в следующем:
- stdio. h должен быть заключен в двойные кавычки или угловые скобки
- После объявления 'int ndigit[10]'отсутствует точка с запятой

CPallini

Мой (виртуальный) 5.

Bill the eternal

У меня была точка с запятой и скобки в программе, просто я не скопировал ее сюда. Мой плохой, но спасибо!

Richard MacCutchan

Отлично работает и в VS 2010.

Bill the eternal

Это прекрасно работает, если я использую готовый текст вместо того, чтобы вводить его в cmd.
Итак, проблема решена, большое вам спасибо за Ваши советы и Ваше время!

2 Ответов

Рейтинг:
1

Nitish Govekar

Я думаю, что вы не использовали scanf для принятия этого текста.


Рейтинг:
0

Patrice T

Вы должны попробовать вот так:

printf("digits =");
for (i = 0; i < 10; ++i)
     printf("%d ", ndigit[i]);
printf(", white space is %d, other is %d\n", nwhite, nother);
getchar()
return 0;


Bill the eternal

Я попробовал это сделать, и хотя в первый раз это сработало нормально, каждый раз, когда я повторял это, ничего не получалось. Однако я понял, что если я изменю EOF на '\n' или что-то еще, то программа будет работать нормально даже без последнего предложенного вами getchar! Я завершаю программу с помощью ctrl+C. Должен ли я делать что-то еще, когда использую EOF?

Patrice T

Ctrl-C убивает программу.
Если я хорошо помню, EOF был Ctrl-Z (старое соглашение DOS), нужно проверить в интернете.