2017-05-01 38 views
0

scanfを使用する前または使用する前に動的にメモリを割り当てる方法があるかどうかを知りたいと思います。これは、初期化するときにサイズをchar *にする必要がないことを意味します。この代わりに、必要なメモリの量は、入力文字列のサイズに応じて割り当てられます(これは、入力後に意味します)。C:スキャン中の動的割り当て

現在、私は入力の大きさを知る前にして、入力を持つ前に、メモリの特定の量を配分するよりも、他の解決策を見つけるん:

char str[10]; 
scanf("%s", str); 

をそして、私は、これは安全ではありません知っている:入力場合が10文字より長い場合、プログラムは割り当てられていないメモリに書き込みを行い、それによりsegfaultsやそのようなものが発生する可能性があります。

+1

あなたが望むものとまったく同じ機能を書くのを止めているのは何ですか? (また、 'str'の宣言は10個のポインタの配列を作成します。これはおそらくあなたが望むものではありません。) –

+1

最初にユーザー入力に 'scanf'を使用しないでください。 – melpomene

+0

@DavidSchwartz私のスキルはそれほど高くありません。私は図書館を読むことを試みましたが、それに書かれているものは何もほとんど分かりませんでした(コメントを除いて:) – nounoursnoir

答えて

0

はコメントで指摘したように、私は信じ%mは、クエリ

別のアプローチは、になります解決

ssize_t getline(char **lineptr, size_t *n, FILE *stream); 

Try Online

int main(void) 
{ 
    char * line; 
    size_t size; 

    if(getline(&line, &size, stdin) != (-1)) 
    { 
     printf("You entered: %s",line); 
    } 

    return 0; 
} 
+0

あなたの 'readLineString'は安全ではなく、512の長さの静的バッファを使います。これは決して動的ではありません。 (それは 'strdup'のマニュアルバージョンですが、それは何のために良いのですか?) – melpomene

+0

@melpomene私は同意します。どのように動的長さの入力を読みますか? –

+1

['getline'](http://man7.org/linux/man-pages/man3/getdelim.3.html)私が怠け者であり、移植可能である必要がないならば。 – melpomene

1

getline機能を使用します入力をnumberバイトに制限するあなたが%10などで変数に割り当てた文字は、10文字しか入力されません。 次に、scanfの次回の呼び出しでより多くの文字を入力できるように入力変数を再配置するには、strを次のように& str [10]以前の入力を上書きしないようにコールします。

1

ユーザ入力はstdinからトリッキーです。


OPの「入力が10文字より長い場合、プログラムは割り当てられていないメモリに書き込みます」という問題が1つあります。入力がより大きい場合、プログラムは割り当てられていないメモリに書き込みます。このgood answerによって示唆されるように


getline();

char str[10]; 
scanf("%s", str); 

は、典型的な解決策です。

私は良い設計目標として「スキャン中の動的割り当て」の考え方を拒否しています。無限の入力を可能にするプログラムは悪用される傾向があります。ユーザーはシステムリソースを圧倒することができます。 良いコードは入力を最初に確認します。もはやHeartbleedはありません。

代わりにの入力が妥当な入力長、10,1000、または1,000,000と評価され、2x程度のバッファが提供されることをお勧めします。

#define MAX_EXPECTED_SIZE 100 
char buf[MAX_EXPECTED_SIZE * 2]; 
if (fgets(buf, sizeof buf, stdin)) { 
    size_t len = strlen(buf); 
    if (len + 1 == sizeof buf && buf[len] != '\n') { 
    // Assume hostile input and act accordingly. Possibly exiting with message. 
    // or consume rest of line 
    int ch; 
    while ((ch = getchar()) != '\n' && ch != EOF); 

    return ERROR_LONG_LINE 
    } 

    // Use buf[] 
} 

コードは、適切なサイズのメモリはその後保持されるbufニーズのコピーで割り当てることができます。