質問するログイン新規登録

回答編集履歴

4

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

2020/04/19 23:47

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -61,7 +61,7 @@
61
61
  S[i]=(char*)malloc(sizeof(char)*(L+1));
62
62
  }
63
63
  for (int i=0; i<N; i++){
64
- scanf("%*s",L,S[i]);
64
+ scanf("%s",S[i]);
65
65
  }
66
66
  <略>
67
67
  for(int i=0; i<N; i++){

3

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

2020/04/19 23:47

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -1,7 +1,8 @@
1
1
  なにはともあれ、scanfのデータを受け取るところとか、printfの"%s"に対応するところにポインタが指定されていない時点でどうあがいてもダメでしょ。
2
2
 
3
3
  2次元配列を考えてて、うまく行かなくて1次元にしたけどなんだか中途半端に前の考えが残っちゃってる、とかいうところかしら?
4
- 確保の仕方はとりあえずそれでOK。
4
+ mallocによる確保の仕方はとりあえずそれでOK。
5
+ (追記:本当は失敗したときのチェックをいれるのがお作法)
5
6
 
6
7
  さてどう格納すべきか。
7
8
  今のプログラム、どうしようもなく間違っているけどその間違い方からすると
@@ -22,7 +23,7 @@
22
23
  一般化すれば
23
24
  S[i*(L+1)]~L+1文字分、ということですね。
24
25
  なので、配列のその場所に取り込むscanfは
25
- `scanf("%*s",L,&S[i*(L+1)])`あるいは同じことだけど`scanf("%*s",L,S+i*(L+1))`
26
+ `scanf("%s",&S[i*(L+1)])`あるいは同じことだけど`scanf("%s",S+i*(L+1))`
26
27
  対応するprintfは
27
28
  `printf("%s",&S[i*(L+1)])`あるいは`printf("%s",S+i*(L+1))`
28
29
  になるでしょう。
@@ -38,7 +39,7 @@
38
39
  char (*S)[L+1] = (char(*)[L+1])malloc(sizeof(char)*N*(L+1));//確保する領域サイズは先と変わらない
39
40
  //これで、S[N][L+1]という二次元配列を確保したことになる
40
41
  for (int i=0; i<N; i++){
41
- scanf("%*s",L,S[i]);
42
+ scanf("%s",S[i]);
42
43
  }
43
44
  <略>
44
45
  for(int i=0; i<N; i++){
@@ -71,4 +72,16 @@
71
72
 
72
73
  ---
73
74
 
74
- 最後に、どうでもいいといえばどうでもいいけど、「障害が発生した」という言い方は、コンピュータのシステムを扱っているギョーカイではユーザーじゃなくてシステム側に問題が出たことの意味だったりする。今回の話にはちょっと不適切。
75
+ 最後に、どうでもいいといえばどうでもいいけど、「障害が発生した」という言い方は、コンピュータのシステムを扱っているギョーカイではユーザーじゃなくてシステム側に問題が出たことの意味だったりする。今回の話にはちょっと不適切。
76
+
77
+ ---
78
+
79
+ 追記。
80
+ printfでは書式指定子中に"*"があるとパラメータから取り込んだ数値に置き換えてくれる機能があって、scanfでもそれが使えるような勘違いをしたので修正したわけですけれど、そういうことをしたいのなら
81
+ ```C
82
+ char format[32];
83
+ int L=10;
84
+ sprintf(format,"%%%ds",L); //結果、formatは"%10s"という文字列になる
85
+ scanf(format,S[i]); //書式指定子は文字列リテラルである必要はない
86
+ ```
87
+ なんていう手段はあります。

2

さらに訂正

2020/04/19 23:44

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  S[2(L+1)]~S[3L+2]:2番めの文字列
21
21
  <以下略>
22
22
  一般化すれば
23
- S[i*(L+1)]~L文字分、ということですね。
23
+ S[i*(L+1)]~L+1文字分、ということですね。
24
24
  なので、配列のその場所に取り込むscanfは
25
25
  `scanf("%*s",L,&S[i*(L+1)])`あるいは同じことだけど`scanf("%*s",L,S+i*(L+1))`
26
26
  対応するprintfは

1

誤記訂正

2020/04/19 14:37

投稿

thkana
thkana

スコア7739

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  S[2(L+1)]~S[3L+2]:2番めの文字列
21
21
  <以下略>
22
22
  一般化すれば
23
- S[*n]~L文字分、ということですね。
23
+ S[i*(L+1)]~L文字分、ということですね。
24
24
  なので、配列のその場所に取り込むscanfは
25
25
  `scanf("%*s",L,&S[i*(L+1)])`あるいは同じことだけど`scanf("%*s",L,S+i*(L+1))`
26
26
  対応するprintfは