私はCプログラミング言語の初心者です。私はCプログラミング言語のヌル文字('\0'
)について非常に混乱しています。Cの文字配列?
以下のプログラムに基づいて、行の文字長は10
(MAXLINE
は10
)です。長さ9のNavindren
のような入力は、配列インデックス0
〜8
を占有します。新しい行文字に達すると、それはインデックス9
に追加され、i
は、1
だけインクリメントされます。 i
は今度はであり、と割り当てられているのは'\0'
で、s[10]
です。
ここでは混乱していますが、配列はインデックスから割り当てられた領域だけであるため、どうすれば可能ですか0
- 9
?私は多くのオンラインリソースを参照しようとしましたが、説明だけでは十分ではありません。
主な機能:
#include<stdio.h>
#define MAXLINE 10
int getline(char line[], int maxline);
void copy(char to[], char from[]);
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) {
printf("%d\n", len);
if (len > max) {
max = len;
copy(longest, line);
}
}
if (max > 0) /* there was a line */ {
printf("%s", longest);
} else {
printf("No Lines Detected\n");
}
return 0;
}
getline関数:
int getline(char s[], int lim) {
int c;
int i;
for (i = 0; i < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
s[i] = c;
}
if (c == '\n') {
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
コピー機能:i
が9
とき、または次のバイトからの読み取りに達したときに
/*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;
}
}
'lines [10]'である '[10]'は、範囲外であるためアクセスされてはいけません(読み書きされません)。それにアクセスすると*未定義の動作*が呼び出されます。 – MikeCAT
Cコンパイラが索引が範囲外であるかどうかを確認するためのコードを生成するのが面倒であるため、 "これはどうですか" *未定義の動作*が呼び出されたときに何かが起きる可能性があります。 – MikeCAT
これはエラーを表示しないことを意味しますか? – naveenath