Int c = getchar()?
ok, поэтому я читаю эту книгу: язык программирования C - Кернигану и Ричи (второе издание), и один из примеров, в которых я не понимаю, как все работает.
#include <stdio.h>
#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(), как можно ввести целое число = символы из командной строки? Целые числа да, но как хранятся символы типа i?
Заранее спасибо
Ответы
Ответ 1
В отличие от некоторых других языков, которые вы, возможно, использовали, символы в C являются целыми числами. char
- это еще один целочисленный тип, обычно 8 бит и меньше, чем int
, но все же целочисленный тип.
Таким образом, вам не нужны функции ord()
и chr()
, которые существуют на других языках, которые вы, возможно, использовали. В C вы можете конвертировать между char
и другими целыми типами с помощью броска или просто путем назначения.
Если EOF не встречается, getchar()
определяется как возвращаемый "беззнаковый char преобразованный в int" (тот же, что и fgetc) поэтому, если это поможет вам представить, что он читает некоторые char, c
, а затем возвращает (int)(unsigned char)c
.
Вы можете преобразовать это обратно в unsigned char
только с помощью броска или назначения, и если вы хотите немного потерять теоретическую переносимость, вы можете преобразовать его в char
с литой или путем присвоения до char
.
Ответ 2
getchar()
возвращает целое число, представляющее собой введенный символ. Если вы введете символ A
, вы получите возвращенный 'A'
или 0x41
(обновленный до int
и если вы, конечно, находитесь в системе ASCII).
Причина, по которой он возвращает int
, а не char
, заключается в том, что он должен иметь возможность хранить любой символ плюс индикатор EOF, где входной поток закрыт.
И, для чего это стоит, это не очень хорошая книга для начинающих. Это с тех пор, когда эффективность имела большее значение, чем читаемость и ремонтопригодность.
Пока он показывает, насколько умны K & R, вы, вероятно, должны смотреть на нечто большее... новичок.
В любом случае последнее издание этого документа охватывает C89 и довольно много изменилось с тех пор. Мы прошли через C99 и теперь имеем C11, и книга не была обновлена, чтобы отразить любой из них, поэтому он ужасно устарел.
Ответ 3
Тип C char
- 8 бит, что означает, что он может хранить диапазон целых чисел от -128 до 127 (255 различных значений, это диапазон ASCII). getchar()
возвращает int
, который будет не менее 16 бит (обычно 32 бит на современных машинах). Это означает, что он может хранить диапазон char
, а также больше значений.
Причина, по которой тип возврата int
заключается в том, что при достижении конца входного потока возвращается специальное значение EOF
. Если тип возврата был char
, то не было бы способа оповестить о том, что был встречен конец потока (если только он не взял указатель на переменную, где это условие было записано).
Ответ 4
Каждый символ (включая числа), введенный в командной строке, считывается как символ, и каждый символ имеет целочисленное значение на основе его кода ASCII http://www.asciitable.com/.
Ответ 5
Ответ на ваш вопрос отвечает. Но добавьте еще 1 вещь.
Как вы объявляете переменную c
как int. Довольно ясно, что вы принимаете значения из 0 to 9
, имеющие значение ascii 48-57
.
Таким образом, вы можете просто добавить еще одну строку в код -
c = c-48
.