25

わかりましたので、この本を読んでいます:The C Programming Language - 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() と書かれているところに、コマンドラインから整数 = 文字を入力するにはどうすればよいですか? 整数はいですが、入力した文字はどのように保存されていますか?

前もって感謝します

4

6 に答える 6

35

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

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

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

キャストまたは代入だけでこれを に戻すことができunsigned charます。理論的な移植性をわずかに失うことを厭わない場合はchar、キャストを使用して に変換するか、 に代入して に変換できますchar

于 2011-08-19T09:28:19.377 に答える
11

このgetchar()関数は、入力された文字を表す整数を返します。文字 を入力するAと、取得'A'または返されます (もちろん ASCII システムを使用していると仮定して0x41、 にアップグレードされます)。int

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

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

K&R のようなものがどれほど賢いかを示していますが、おそらくもっと... 初心者に優しいものを見ているは​​ずです。

いずれにせよ、前回の版は C89 をカバーしており、その後かなり多くの変更が加えられました。私たちは C99 を経て、現在は C11 を持っていますが、本はそれらのいずれかを反映するように更新されていないため、恐ろしく古くなっています。

于 2011-08-19T09:20:49.480 に答える
5

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

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

于 2011-08-19T09:21:58.580 に答える
0

それでは、論理ゲームをしましょう。

Char は int よりも小さい範囲、より具体的には 8 ビット、つまり 1 バイトの整数型でもあります。ご存知のように、整数型は符号付き (デフォルト) と符号なしで構成されます。char については、signed の範囲は -127 ~ 128 で、unsigned の範囲は 0 ~ 255 です。これで、signed と unsigned char の型と「機能」がわかりました。

私たち人間は文字を理解しますが、コンピューターはバイナリ シーケンスのみを認識します。したがって、すべての種類のプログラミング言語は、文字からバイナリ シーケンスへの変換を処理するモデルを提供する必要があります。ASCII コードは、C や他の多くのプログラミング言語に適用されるマッピングの標準です。通常の特殊文字だけでなく、0 ~ 9、az、AZ などの基本文字をコーディングするには、0 ~ 255 が必要です。

unsigned char が正確な選択であると思うかもしれません。ただし、プログラミングはいつ停止するかを知っている必要があります。最も簡単な方法は、特別な値を満たすことです。他の言語ではより大きな正の値が使用される可能性があるため、負の値を選択することをお勧めします。最後に、C は -1 を選択しました。これは、より一般的に EOF と呼ばれます。

これで要点がわかりました。符号付き char は ASCII 文字をコーディングするのに十分ではありませんが、符号なしは終了値の余地がありません。これをバランスさせるには、より大きな範囲、つまり int 型が必要です。サビー?

@cdhowie の回答に感謝します。

于 2020-10-30T03:51:17.013 に答える
-3

あなたの質問に対する回答が回答されました。しかし、もう1つ追加するだけです。

変数cをintとして宣言しているため。0 to 9のASCII値を持つことから値を取得していることは明らかです48-57。したがって、コードにもう1行追加するだけです-

c = c-48.

于 2014-06-13T18:26:01.397 に答える