プログラミングの勉強を始めたばかりです。これは私の最初の投稿です。Kernighan と Ritchie による「C プログラミング言語」という本を読んでいて、理解できない例に出くわしました (セクション 1.9、p 30)。
このプログラムは、テキストを入力として受け取り、最も長い行を決定して、それを出力します。Char 配列 line[MAXLINE] が宣言されています。MAXLINE は 1000 です。これは、この配列の最後の要素が MAXLINE-1 のインデックス (999) を持っていることを意味します。しかし、関数 getline を見ると、line[ が渡されています。 ] 配列を引数として (そして MAXLINE を lim として) 使用すると、ユーザー入力が MAXLINE よりも 1 行長い場合、i = lim、つまり i = MAXLINE になるまで i がインクリメントされるように見えます。したがって、ステートメント line[i] = '\0' は line[MAXLINE] = '\0' になります。
これは私には間違っているように見えます.line[]のサイズがMAXLINEの場合、line[MAXLINE]の場所にどのように書き込むことができますか. 配列の外側の場所に書き込んでいませんか?
私が思いつく唯一の説明は、char 配列 [サイズ] を宣言すると、C 言語が実際に char 配列 [サイズ + 1] 配列を作成し、最後の要素が NULL 文字用に予約されているということです。もしそうなら、これはかなり紛らわしく、本では言及されていません。誰でもこれを確認したり、何が起こっているのか説明できますか?
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print the longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
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;
}
/* copy: copy 'from' into 'to'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}