回答編集履歴

4

修正しわすれがあった...

2020/04/19 23:47

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  for (int i=0; i<N; i++){
126
126
 
127
- scanf("%*s",L,S[i]);
127
+ scanf("%s",S[i]);
128
128
 
129
129
  }
130
130
 

3

scanfの書式指定の使い方に誤りがあったので訂正

2020/04/19 23:47

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  2次元配列を考えてて、うまく行かなくて1次元にしたけどなんだか中途半端に前の考えが残っちゃってる、とかいうところかしら?
6
6
 
7
- 確保の仕方はとりあえずそれでOK。
7
+ mallocによる確保の仕方はとりあえずそれでOK。
8
+
9
+ (追記:本当は失敗したときのチェックをいれるのがお作法)
8
10
 
9
11
 
10
12
 
@@ -46,7 +48,7 @@
46
48
 
47
49
  なので、配列のその場所に取り込むscanfは
48
50
 
49
- `scanf("%*s",L,&S[i*(L+1)])`あるいは同じことだけど`scanf("%*s",L,S+i*(L+1))`
51
+ `scanf("%s",&S[i*(L+1)])`あるいは同じことだけど`scanf("%s",S+i*(L+1))`
50
52
 
51
53
  対応するprintfは
52
54
 
@@ -78,7 +80,7 @@
78
80
 
79
81
  for (int i=0; i<N; i++){
80
82
 
81
- scanf("%*s",L,S[i]);
83
+ scanf("%s",S[i]);
82
84
 
83
85
  }
84
86
 
@@ -145,3 +147,27 @@
145
147
 
146
148
 
147
149
  最後に、どうでもいいといえばどうでもいいけど、「障害が発生した」という言い方は、コンピュータのシステムを扱っているギョーカイではユーザーじゃなくてシステム側に問題が出たことの意味だったりする。今回の話にはちょっと不適切。
150
+
151
+
152
+
153
+ ---
154
+
155
+
156
+
157
+ 追記。
158
+
159
+ printfでは書式指定子中に"*"があるとパラメータから取り込んだ数値に置き換えてくれる機能があって、scanfでもそれが使えるような勘違いをしたので修正したわけですけれど、そういうことをしたいのなら
160
+
161
+ ```C
162
+
163
+ char format[32];
164
+
165
+ int L=10;
166
+
167
+ sprintf(format,"%%%ds",L); //結果、formatは"%10s"という文字列になる
168
+
169
+ scanf(format,S[i]); //書式指定子は文字列リテラルである必要はない
170
+
171
+ ```
172
+
173
+ なんていう手段はあります。

2

さらに訂正

2020/04/19 23:44

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  一般化すれば
44
44
 
45
- S[i*(L+1)]~L文字分、ということですね。
45
+ S[i*(L+1)]~L+1文字分、ということですね。
46
46
 
47
47
  なので、配列のその場所に取り込むscanfは
48
48
 

1

誤記訂正

2020/04/19 14:37

投稿

thkana
thkana

スコア7703

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  一般化すれば
44
44
 
45
- S[*n]~L文字分、ということですね。
45
+ S[i*(L+1)]~L文字分、ということですね。
46
46
 
47
47
  なので、配列のその場所に取り込むscanfは
48
48