web-dev-qa-db-ja.com

int c = getchar()?

oK、この本を読んでください:The C Programming Language-By Kernighan and Ritchie(第2版)および例の1つは、物事の仕組みを理解するのに苦労しています。

_#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()と書かれていますが、コマンドラインから整数=文字を入力するにはどうすればよいですか?整数はいですが、入力した文字はどのように保存されますか?

前もって感謝します

22
Rhexis

使用した他の言語とは異なり、Cの文字整数です。 charは別の整数型で、通常は8ビットで、intよりも小さいですが、それでも整数型です。

したがって、使用した可能性のある他の言語に存在するord()およびchr()関数は必要ありません。 Cでは、キャストを使用して、または単に代入することで、charと他の整数型の間で変換できます。

EOFが発生しない限り、getchar()はintに変換されたunsigned char "を返すように定義されています( fgetcと同じ )。それは、cという文字を読み取り、(int)(unsigned char)cを返すことを想像できます。

これをキャストまたは割り当てだけでunsigned charに変換し直すことができます。理論上の移植性を少しでも損なう場合は、キャストを使用してcharに変換するか、 char

30
Steve Jessop

getchar()関数は、入力された文字の表現である整数を返します。文字Aを入力すると、'A'または0x41が返されました(intにアップグレードされ、ASCIIシステムの場合)を使用していると仮定します)。

intではなくcharを返す理由は、任意の文字を格納できる必要があるためですplus the EOF入力ストリームが閉じているインジケータ。

そして、それが価値があるものとして、それは初心者にとっては本当に良い本ではありません。読みやすさと保守性よりも効率が重要だった時代からです。

K&Rがどれほど優れているかを示していますが、おそらくもっと初心者に優しいものを見るべきでしょう。

いずれにせよ、それの最後の版はC89をカバーし、それ以来かなり多くの変更がありました。私たちはC99を経て、今ではC11を持っていますが、どちらも反映するように本が更新されていないため、恐ろしく古くなっています。

11
paxdiablo

C char型は8ビットです。これは、整数の範囲を格納できることを意味します(符号付きかどうかに応じて、C標準は、指定しない場合はどちらかを決定しません) -128〜127または0〜255(255個の異なる値。これはASCIIの範囲です)。 getchar()intを返します。これは少なくとも16ビット(最新のマシンでは通常32ビット)になります。これは、charの範囲だけでなく、より多くの値を格納できることを意味します。

戻り値の型がintである理由は、入力ストリームの終わりに達すると特別な値EOFが返されるためです。戻り値の型がcharの場合、ストリームの終わりに到達したことを通知する方法はありません(この条件が記録された変数へのポインターを取得しない限り)。

4
cdhowie