🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

1884閲覧

scanfに関して c++

korr

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/04 05:53

編集2019/12/04 16:44

下のコードを実行すると、
Segmentation fault: 11
というエラーが表示されます。

ベクトルに値を格納するのは、問題なく実行できました。

制約条件
2 <= n <= 10^5
1 <= a_i <= n

input.txt

3 // n 3 // a_1 1 // a_2 2 // a_3

c++

1#include<bits/stdc++.h> 2using namespace std; 3 4int main() { 5 freopen("../input.txt", "r", stdin); 6 7 int n; 8 cin >> n; 9 int a[100010]; 10 for (int i = 0; i < n; ++i) { 11 scanf("%d",&a[i]); 12 } 13 cout << a[1] << endl; 14 return 0; 15}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

cinはリダイレクトというかファイルに割り当てていて、
scanfは標準入力からデータを取りますから、
ファイルからnの値を取り込んだ後、キーボードからの入力を待っているだけじゃないですか?
「終わらない」状態で例えば3[Enter]1[Enter]2[Enter]と入力したらどうなりますか?

それとは関係ありませんが、//がコメントと解釈されるのはソースコードの中だけです。int型変数や"%d"で数値を待っているcinやscanfに//を与えたらどうなるかはご存知ですか?

投稿2019/12/04 13:49

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/12/04 16:35

//は、teratailで掲示するために分かりやすく書き加えました!
thkana

2019/12/04 22:50

それで分かりやすくなったのかはともかく、実際にやったのと違うならその旨わかるようにしてください。 それと、状況が変わったとしても、それまであったことが無かったことになるわけではありません。 変化した状況は上書きでなく追記にしてください。これまでの回答がトンチンカンなやりとりになってしまいます。
pepperleaf

2019/12/05 13:16

余談ですが、 atoi()だと、// があっても問題無し。
guest

0

スタックに390KB(int a[100010];)も取るのはおかしいです。

投稿2019/12/04 09:53

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/12/04 16:37

atcoderという競技プログラミングの解説者が実際に解説動画で書かれていたコードです!
kaina

2019/12/05 04:13

だから?そこで思考停止していいの?
pepperleaf

2019/12/05 13:07

> スタックに390KB そんなのおかしい、、と思いつつも、VC++(2019)は文句言わないですね。 必要なら、確保すれば、良いですが、意味も分からずにそのまま、コピペは問題。
guest

0

ベストアンサー

この辺はあまり詳しくないですが、、、

scanf("%d",&a[i]);

--> cin >> a[i];

とし、データファイルを

text

13 23 31 42

とする。 (cinでの書式付き入力がよく分からない)
scanf() は、標準入力からの読み込みですが、cin と混在した場合の挙動が保証されている? のでしょうか。 cinのバッファを切り替えた時点で? です。


割り切って Cの入力を使うならば、 stdin.h をインクルードし、

C

1/// なんか 2FILE *fp = fopen("../input.txt", "r"); 3/// なんか 4char buff[100]; 5fgets(buff, 100, fp); // 文字列として行を読み込む 6n = atoi(buff);   // 数字取得

---さらに、追記 ---
scanf() --> fscanf(stdin, ...) ですね。で、他の方も書かれているように、cinと混在させるものでは無いです。 速度を気にされているようですが、参考にしたサイトがそう書かれているとの事ですが、何でそうしたのか、解説が無いでしょうか? まずは、その辺りからでしょう。
scanf()系が遅いのは、単純。読み込みフォーマットを引数の文字列で指定しているので、その解釈時間が余分なコストになるから。cinが遅いのは調べた事無いので推測ですが、scanf()等より、高度な事を内部でしているのでしょう。

投稿2019/12/04 09:03

編集2019/12/05 13:15
pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/12/04 09:35

cin >> a[i]ではできるのですが、入力の個数が最大10^5と多いので、処理が早いscanfで書こうと思いました 競技プログラミングの動画では、混在した書き方でした。。
pepperleaf

2019/12/04 09:54

自分の知る限り、 scanf()系は遅いと思っています。 (処理系依存ですが) 割り切って、 Cの構文で読み込む方法で、回答を更新しました。 参考までに
korr

2019/12/04 16:39

atcoderの解説者が比較的速いと言っていたので、使おうと思いました。 参考にいたします。
thkana

2019/12/05 12:59

10万回のループでどれだけ差が出ることを期待しているのですか?> 速い
pepperleaf

2019/12/05 13:02

> atcoderの解説者が比較的速い 何に対して"速い"と言っているのか? 多分、cinに対してじゃないでしょうか。
guest

0

ifstream in("../input.txt"); cin.rdbuf(in.rdbuf());

c++

1freopen("../input.txt", "r", stdin);

投稿2019/12/04 07:13

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/12/04 07:23

Segmentation fault: 11 と出てきます。 scanfで統一してもこのエラーは変わりませんでした
asm

2019/12/04 10:07

うーん。Linuxやmingwを含む複数の環境で追試してみましたが再現しません。
guest

0

cinとscanfを併用するのがよくないかもしれないです。どちらかに統一してみてはどうでしょうか。

投稿2019/12/04 06:20

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

korr

2019/12/04 06:27

scanfに統一しても変わりませんでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問