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

回答編集履歴

3

文字数制限コード追記

2020/04/19 16:41

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -8,4 +8,17 @@
8
8
 
9
9
  あなたがやりたいことは
10
10
  `scanf("%s", &S[i * (L + 1)]);`と
11
- `printf("%s", &S[i * (L + 1)]);`でしょう。
11
+ `printf("%s", &S[i * (L + 1)]);`でしょう。
12
+
13
+ (追記)
14
+ `print`の文字数を指定する書式指定`%*s`とは異なり、`scanf`の書式指定`%*s`は読み捨てを意味しています。
15
+ L文字制限をかけたいならこんな感じですね。
16
+ ```C
17
+ char format[15];
18
+ sprintf(format, "%%%ds%%*[^\n]%%*c", L);
19
+ for (int i = 0; i < N; i++) {
20
+ scanf(format, &S[i * (L + 1)]);
21
+ }
22
+ ```
23
+ `%*[^\n]`でL文字を超えた部分の改行文字以外を読み捨て。
24
+ `%*c`で改行文字を読み捨て。

2

コード追記

2020/04/19 16:41

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -4,4 +4,8 @@
4
4
 
5
5
  `scanf("%*s",N,S[i]);`
6
6
  書式指定`%*s`は読み取ったものを格納しません。
7
- 引数も誤っています。
7
+ 引数も誤っています。
8
+
9
+ あなたがやりたいことは
10
+ `scanf("%s", &S[i * (L + 1)]);`と
11
+ `printf("%s", &S[i * (L + 1)]);`でしょう。

1

説明修正

2020/04/19 13:55

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  `S[i]`は`*(S+i)`と等価です。
2
- つまり先頭からi文字目となっており意図したアドレスアクセスていません。
2
+ つまり先頭からiの要素となっており意図したアドレスへのアクセスになっていません。
3
3
  `&S[i * (L + 1)]`ですね。
4
4
 
5
5
  `scanf("%*s",N,S[i]);`