int c = getchar ()?

хорошо, поэтому я читаю эту книгу: язык программирования C – Кернигану и Ричи (второе издание), и один из примеров им трудно понять, как все работает.

#include  #define MAXLINE 1000 int getline(char line[], int maxline); void copy(char to[], char from[]); int main(int argc, char *argv[]) { int len; int max; char line[MAXLINE]; char longest[MAXLINE]; max = 0; while((len = getline(line, MAXLINE)) > 1) { if(len > max) { max = len; copy(longest, line); } } if(max > 0) printf("%s", longest); getchar(); getchar(); return 0; } int getline(char s[], int lim) { int c, i; for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) s[i] = c; if(c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } void copy(char to[], char from[]) { int i; i = 0; while((to[i] = from[i]) != '\0') ++i; } 

строка: for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) где указано c = getchar (), как можно integer = ввод символов из командной строки? Целые числа да, но как хранятся символы типа i?

заранее спасибо

В отличие от некоторых других языков, которые вы, возможно, использовали, символы в C являются целыми числами. char – это еще один целочисленный тип, обычно 8 бит и меньше, чем int , но все же целочисленный.

Таким образом, вам не нужны функции ord() и chr() которые существуют на других языках, которые вы, возможно, использовали. В C вы можете конвертировать между char и другими целыми типами с помощью броска или просто путем назначения.

Если EOF не встречается, getchar() определен для возврата «unsigned char, преобразованного в int» (так же, как fgetc ), поэтому, если это поможет вам представить, что он читает некоторый символ c , то возвращает (int)(unsigned char)c .

Вы можете преобразовать это обратно в unsigned char просто с помощью броска или присвоения, и если вы хотите немного потерять теоретическую переносимость, вы можете преобразовать его в char с литой или назначив его char .

getchar() возвращает целое число, представляющее собой введенный символ. Если вы введете символ A , вы получите 'A' или 0x41 возвращенный (обновленный до int и предполагающий, что вы на ASCII-системе, конечно).

Причина, по которой он возвращает int а не char заключается в том, что он должен иметь возможность хранить любой символ плюс индикатор EOF, где входной stream закрыт.

И, для чего это стоит, на самом деле это не очень хорошая книга для начинающих. Это с тех пор, когда эффективность важна, чем читаемость и ремонтопригодность.

Пока он показывает, насколько умны такие, как K & R, вы, вероятно, должны смотреть на нечто большее … новичок.

Во всяком случае, последнее издание его охватывало C89 и довольно много изменилось с тех пор. Мы прошли через C99 и теперь имеем C11, и книга не обновлена, чтобы отразить любой из них, поэтому она ужасно устарела.

Тип C char – 8 бит, что означает, что он может хранить диапазон целых чисел от -128 до 127 (255 различных значений, это диапазон ASCII). getchar() возвращает int , который будет не менее 16 бит (обычно 32 бит на современных машинах). Это означает, что он может хранить диапазон char , а также больше значений.

Причина, по которой тип возврата является int заключается в том, что при достижении конца входного streamа возвращается специальное значение EOF . Если тип возврата был char , тогда не было бы способа сообщить, что был встречен конец streamа (если только он не взял указатель на переменную, где это условие было записано).

Каждый символ (включая числа), введенный в командной строке, считывается как символ, и каждый символ имеет целочисленное значение на основе его кода ASCII http://www.asciitable.com/ .

Ответ на ваш вопрос ответил. Но добавьте еще одну вещь.

Поскольку вы объявляете переменную c как int. Довольно ясно, что вы принимаете значения от 0 to 9 имеющие значение ascii 48-57 . Таким образом, вы можете просто добавить еще одну строку в код-

c = c-48 .

Давайте будем гением компьютера.