回答編集履歴

2

指摘により編集

2022/11/29 21:43

投稿

thkana
thkana

スコア7629

test CHANGED
@@ -1,5 +1,3 @@
1
- この「質問」、よく読むと「何を知りたいか」書いてないんですけどね。質問ではなくて不具合報告書ですか?
2
-
3
1
  scanfは書式指定と入力で順次マッチングを取って、マッチングが取れた部分に変換指定があれば変換して取り込む一方、マッチングしないことが確実になればそこで処理を諦めて以降の取得をせずにリターンするという動作をします。
4
2
 
5
3
  `"%255s[^\n]%n%*[\n]"`がどういう入力にマッチするかというと、
@@ -13,5 +11,6 @@
13
11
  多分、`"%255[^\n]%n"`とかしたかったのかなぁ、と想像はします。
14
12
  scanfの沼にハマらずに、既に他の回答にありますがfgetsとsscanfあたりに逃げておいたほうが、同じことが楽にできたのではないかと思います。
15
13
 
14
+ ところで、この「質問」、よく読むと「何を知りたいか」書いてないんですけど。質問ではなくて不具合報告書ですか?
16
15
 
17
16
 

1

一部記述がマークダウンに喰われていたので修正

2022/11/29 12:30

投稿

thkana
thkana

スコア7629

test CHANGED
@@ -6,7 +6,7 @@
6
6
  `%255s`で255字までの文字列にマッチし
7
7
  `[`で'['にマッチ...ところが、'['は先に文字列にマッチしてしまうので文字列に引き続いて[がマッチするのは255文字文字が続いてその次に[が来たときだけです。なので、この変換指定文字列は254文字以下の文字列が入力された段階(文字列に'\n'が続く状態)で以降はマッチしないことが確定し、%nに対する評価は行われません。
8
8
  ということで、ローカル変数charlengthにはなんの作用も行われず、未初期化のローカル変数として不定値になります。
9
- 最後までマッチさせるとするなら"aaaa...(255文字)...a[^(改行)](改行)改行以外なにかの文字(改行)"と入力すればよいでしょう。"aaaa...(255文字)...a"が%255sにマッチし、[^(改行)]が"[^\n]"にマッチし、%*[\n]に改行がマッチして、改行以外のなにかの文字でマッチングが終了します。
9
+ 最後までマッチさせるとするなら`"aaaa...(255文字)...a[^(改行)](改行)改行以外なにかの文字(改行)"`と入力すればよいでしょう。"aaaa...(255文字)...a"が%255sにマッチし、[^(改行)]が"[^\n]"にマッチし、%*[\n]に改行がマッチして、改行以外のなにかの文字でマッチングが終了します。最後の改行はなにかの文字を標準入力に押し込むために必要。
10
10
 
11
11
  また、"%255s"にいきなり改行を与えても、%sはデータ先頭の区切り文字(改行含む)は読み飛ばしますからscanfから抜けません。
12
12