ユーザ入力は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
ニーズのコピーで割り当てることができます。
あなたが望むものとまったく同じ機能を書くのを止めているのは何ですか? (また、 'str'の宣言は10個のポインタの配列を作成します。これはおそらくあなたが望むものではありません。) –
最初にユーザー入力に 'scanf'を使用しないでください。 – melpomene
@DavidSchwartz私のスキルはそれほど高くありません。私は図書館を読むことを試みましたが、それに書かれているものは何もほとんど分かりませんでした(コメントを除いて:) – nounoursnoir