質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

2460閲覧

scanfで文字列を取得する際に文字列の大きさに合わせてメモリを事前に動的確保したい

Buront

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/03/23 12:31

stdlibのscanfを使って文字列を取得したいのですが

C

1 char* C 2 //ここでメモリを動的確保 3 scanf("%s",C);

といった感じのコードを使いたいのですが、何処を調べてもだいたい配列を使ってコードを書いているので
理想的にはPOSIXでのscanfのように動いて欲しいのです。
環境はVisualStudio2017の標準Cを使っていす。

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

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

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

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

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

maisumakun

2019/03/23 12:46

「POSIXでのscanf」にも、メモリ確保の機能はなかったかと思うのですが…
maisumakun

2019/03/23 12:50

すみません、ありがとうございます。
guest

回答5

0

おおよそで、mallocして、fgetsして、足りなければ(取得末尾に\nがなければ)、より大きなエリアをreallocして、続きのエリアにfgetsして、・・・・・
というのを、\nが来るまで繰り返す。

投稿2019/03/23 13:41

otn

総合スコア84423

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

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

otn

2019/03/23 13:45

ああ、空白文字が含まれた行だと、scanf("%s") と同じになりませんね。 1行まるごと入力していい場合の回答です。 scanfも%sの長さ制限で同じようなことが出来ると思いますけど、入力し終えたかどうか分かるかどうかは調べてません。
guest

0

ベストアンサー

Section: Linux Programmer's Manual (3)
の例“動的割り当て変換指定子を使用するには〜”を参照・・・・%mが使えなければサポートされてないと思います。

投稿2019/03/23 12:55

cateye

総合スコア6851

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

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

cateye

2019/03/23 12:58

間違ってもscanf_S()は使わないでください。他のコンパイラでコンパイルできなくなります。
Buront

2019/03/23 13:02

成程、回答ありがとうございました。 どうも私のVS2017では%mが使えないようなのでまず其処をどうにかしようと思います。
guest

0

入力文字数を事前に知り、そのサイズで確保すればいいだけです。

え?できない?なら、それは無理ってことですね

投稿2019/03/23 12:34

y_waiwai

総合スコア87719

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

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

0

"scanf文字列取得と動的メモリ確保"の記事に「m 修飾子への対応はバージョン 2.7 以降の glibc で追加されている」と書かれています。

これが正しいのであれば、glibcのアップグレード の記事を参考にして、glibc-2.7を使うようにしてみては如何でしょうか。

投稿2019/03/23 13:04

coco_bauer

総合スコア6915

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

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

0

gccで拡張機能をエラーにするオプション(-pedantic-errors)をオンの状態でscanf("%ms", &c);を使うとエラーになります。
(なぜかclangだと無警告で通ってしまう)

C言語のPOSIX拡張使うくらいならばC++使えばいいのではないでしょうか?

c++

1#include <string> 2#include <iostream> 3 4int main(){ 5 std::string s; 6 std::cin >> s; 7 puts(s.c_str()); 8}

投稿2019/03/23 15:18

編集2019/03/23 15:21
asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問