Как мне запустить программу, использующую getchar?
Вопрос
Я полный профан, пытаюсь выучить себя C от K & R.Мой вопрос в некотором роде смущающе элементарен.Ладно, поехали:Я не могу заставить программы, использующие getchar, выдавать тот результат, который я ожидал.Если у вас случайно есть K & R под рукой, я застрял на упражнении 1.13.Вопрос звучит так: "Напишите программу для печати гистограммы длин слов во входных данных." и я даже не могу взяться за горизонтальную версию из-за этой проблемы, которая у меня возникла.
Я нахожусь на XP, используя Dev-C ++ (компилятор MinGW) и запуская программы из командной строки.Моя проблема в том, что когда я пытаюсь запустить свою программу, она ждет, пока я введу символы для сканирования, но когда я заканчиваю ввод и нажимаю Enter, этого не происходит что угодно.Я ожидаю, что он продолжит работу и выведет гистограмму, как я и ожидал.На самом деле, похоже, что он даже не подсчитывает длину слов, потому что, как вы можете видеть в коде, когда я пытаюсь напечатать то, что находится в массиве ctr, просто чтобы посмотреть, содержит ли он что-нибудь, ничего не печатается.
Я настолько n00b, что понятия не имею, виноват ли в этом мой код или командная строка.Но я подозреваю, что это что-то с системой, потому что когда я пытаюсь скомпилировать и запустить типовая программа, происходит то же самое.Введите ввод, нажмите Enter, ничего не произойдет.Если я нажму Ctrl-C, иногда он выдает одну или две звездочки, которые совсем не похожи на выходные данные модели.В других случаях это ничего не делает (просто возвращается к командной строке).
Вот мой код для этого упражнения.Я потратил на это целый день и сомневаюсь в своей способности продолжать заниматься программированием.Я был бы очень, очень признателен, если бы кто-нибудь смог вытащить меня из этой дыры!
Кроме того, у меня есть еще один вопрос о модельной программе, о которой я упоминал выше, но я думаю, что мне следует опубликовать его в отдельном вопросе.Спасибо всем :)
#include <stdio.h>
//#define 1 IN
//#define 0 OUT
int main () {
//start w/ state = OUT
int c = 0;
// int state = OUT;
int len = 0;
int ctr[12];
int i, j;
i = j = 0;
for (i = 0; i <12; i++)
ctr[i] = 0;
while ((c = getchar()) != EOF)
if (c != ' ' && c != '\t' && c != '\n') {
// state = IN;
len++;
printf("%d", len);
}
else {
ctr[len]++;
len = 0;
}
for (i = 0; i <12; i++)
printf("%d\n", ctr[i]);
for (i = 0; i <12; i++) {
printf("%d\n", i);
for (j = 0; j <= ctr[i]; j++)
printf("-");
printf("\n");
}
return 0;
}
Решение
Ваш цикл while ищет EOF, который обозначает конец файла, а не конец строки.
В Windows вам нужно ввести ctrl-z, чтобы имитировать конец файла.
Другие советы
Не похоже, что вы на самом деле храните c (свой ввод) где бы то ни было...ни печатать его.Вы печатаете размер строки, но не сами символы.Если у вас ctr[i] = c;где-нибудь (это вы добавляете символ в массив), а затем печатаете массив, вы увидите свои входные данные.О, и да, ответ о ctrl-z также важен.Кроме того, если вы совершенно не знакомы с языком, я бы настоятельно рекомендовал вам заключить содержимое while в квадратные скобки.Пройдет некоторое время, прежде чем вы сможете просто взглянуть на код и узнать, что подпадает под действие цикла while, а что нет, если вокруг него не будет фигурных скобок.
Я не увидел ничего действительно неправильного в коде, поэтому я загрузил его в gcc, и, похоже, он работает нормально, если вы помните, что вам нужно ввести EOF (CTRL-D), чтобы завершить цикл while.Я ввел 4 строки, и хотя я не могу сделать никаких заявлений о правильности ответов, каждый раз, когда я нажимаю enter, я получаю серию чисел, равную количеству введенных мною символов, за которыми следует пробел.Это именно то, что ваш код предписывает делать.
Когда я ввел CTRL-D, я получил сводную информацию.Опять же, я не собираюсь делать никаких заявлений о корректности выходных данных, но я получил два основных раздела, как описано в вашем коде.