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()と書かれていますが、コマンドラインから整数=文字を入力するにはどうすればよいですか?整数はいですが、入力した文字はどのように保存されますか?
前もって感謝します
使用した他の言語とは異なり、Cの文字は整数です。 char
は別の整数型で、通常は8ビットで、int
よりも小さいですが、それでも整数型です。
したがって、使用した可能性のある他の言語に存在するord()
およびchr()
関数は必要ありません。 Cでは、キャストを使用して、または単に代入することで、char
と他の整数型の間で変換できます。
EOFが発生しない限り、getchar()
はintに変換されたunsigned char "を返すように定義されています( fgetcと同じ )。それは、c
という文字を読み取り、(int)(unsigned char)c
を返すことを想像できます。
これをキャストまたは割り当てだけでunsigned char
に変換し直すことができます。理論上の移植性を少しでも損なう場合は、キャストを使用してchar
に変換するか、 char
。
getchar()
関数は、入力された文字の表現である整数を返します。文字A
を入力すると、'A'
または0x41
が返されました(int
にアップグレードされ、ASCIIシステムの場合)を使用していると仮定します)。
int
ではなくchar
を返す理由は、任意の文字を格納できる必要があるためですplus the EOF入力ストリームが閉じているインジケータ。
そして、それが価値があるものとして、それは初心者にとっては本当に良い本ではありません。読みやすさと保守性よりも効率が重要だった時代からです。
K&Rがどれほど優れているかを示していますが、おそらくもっと初心者に優しいものを見るべきでしょう。
いずれにせよ、それの最後の版はC89をカバーし、それ以来かなり多くの変更がありました。私たちはC99を経て、今ではC11を持っていますが、どちらも反映するように本が更新されていないため、恐ろしく古くなっています。
C char
型は8ビットです。これは、整数の範囲を格納できることを意味します(符号付きかどうかに応じて、C標準は、指定しない場合はどちらかを決定しません) -128〜127または0〜255(255個の異なる値。これはASCIIの範囲です)。 getchar()
はint
を返します。これは少なくとも16ビット(最新のマシンでは通常32ビット)になります。これは、char
の範囲だけでなく、より多くの値を格納できることを意味します。
戻り値の型がint
である理由は、入力ストリームの終わりに達すると特別な値EOF
が返されるためです。戻り値の型がchar
の場合、ストリームの終わりに到達したことを通知する方法はありません(この条件が記録された変数へのポインターを取得しない限り)。