Подтвердить что ты не робот

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?

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

4b9b3361

Ответ 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.