ユーザーの入力で最も長い行を見つけて、行の長さと行自体を出力するCプログラムを書いています。文字のカウントには成功しますが、予期せず行自体の保存に失敗します。多分私はCのメモリ管理を誤解しており、誰かが私を修正することができます.
編集: フォローアップの質問: char に続くブロックdummy
が割り当てられていないため、コンピューターがブロックを操作できる範囲が開いていることを理解しましたが、一部の char のストレージがまだ機能するのはなぜですか? 私が言及した 2 番目の例では、プログラムは文字を「未割り当て」ブロックに格納するべきではありませんが、格納します。なんで?
変数:
getchar()
はc
毎回 iに保存されますgetchar()
i
私がいる現在の行の長さ(これまでのところ)getchar()
ですlongest_i
これまでの最長の線の長さですtwostr
2 つの文字列のうち最初の文字列の先頭を指します。最初の文字列は現在の行、2 番目の文字列はこれまでの最長の行です。行が最も長いことが検出されると、2 番目の文字列にコピーされます。将来の行がさらに長い場合、2 番目の文字列の一部が上書きされますが、もう使用しないので問題ありません。2 番目の文字列は、より右側の位置から開始されます。dummy
twostr
指す場所を与える
これは、プログラムの変数によって使用されるメモリを視覚化する方法です。
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|\n| 7|11|15|c |u |r |r |e |n |t |\0|e |s |t |\0|p |r |e |v |l |o |n |g |e |s |t |\0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
真のステートメント:
&c == 11
&i == 12
&longest_i == 13
&twostr = 14
&dummy = 15
プログラム:
#include <stdio.h>
int main()
{
char c = '\0';
int i, longest_i;
char *twostr;
longest_i = i = 0;
char dummy = '\0';
twostr = &dummy;
while ((c=getchar()) != EOF)
{
if (c != '\n')
{
*(twostr+i) = c;
i++;
}
else
{
*(twostr+i) = '\0';
if (i > longest_i)
{
longest_i = i;
for (i=0; (c=*(twostr+i)) != '\0'; ++i)
*(twostr+longest_i+1+i) = c;
}
i = 0;
}
}
printf("length is %d\n", longest_i);
for (i=0; (c=*(twostr+longest_i+1+i)) != '\0'; ++i)
putchar(c);
return 0;
}
from *(twostr+longest_i+1))
until'\0'
は予測不能です。例:
入力:
longer line
line
出力:
length is 11
@
入力:
this is a line
this is a longer line
shorter line
出力:
length is 21
this is a longer lineÔÿ"