1

したがって、CIでユーザーキーボード入力を取得する方法の1つは、次のとおりです。

char buffer[LENGTH_KNOWN] = "";
scanf("%s",buffer);

任意の長さのユーザー入力を取得する方法があるかどうか疑問に思いました。次のように試しましたが、セグメンテーション違反が発生しました。

char* buffer = "";
scanf("%s",buffer);
printf("%s",buffer);

ただし、これは機能しているようです。

char* buffer = "TEST........keeps going....................."
scanf("%s",buffer);
printf("%s",buffer);

誰かが私がこのエラーを受け取っている理由を説明できますか?mallocを使用せずにバッファオーバーフローをチェックせずに任意のユーザー入力をスキャンする簡単な方法はありますか?

前もって感謝します!

4

5 に答える 5

3

文字列リテラルに書き込むことができないため、実際には両方が間違っています(どちらの例でもbuffer文字列リテラルを指しています)。

単一のを介して任意の長さの入力を取得することは不可能scanfです。ループで入力を取得し、実際のバッファーに追加し続ける必要があります。

mallocを使用せず、バッファオーバーフローをチェックせずに、任意のユーザー入力をスキャンする簡単な方法はありますか?

あなたのためにそれを行う既製の関数を使用してください。のようなものgetline(3)(残念ながら非標準)。

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

この関数は、ストリームから1行全体を読み取り、テキスト(改行と終了ヌル文字を含む)をバッファーに格納し、バッファーアドレスをに格納します*lineptr

于 2013-01-10T04:39:40.490 に答える
1

char *buffer = "...";完全に間違っています。二重引用符で囲まれたものは文字列リテラルであり、読み取り専用であるため、これはメモリの割り当て方法ではありません。次のようにメモリを割り当てることができます。

char buffer[1024];

またはmallocを使用して動的に:

char *buffer = malloc(1024);

/* .... */

free(buffer);
于 2013-01-10T04:39:47.967 に答える
1
 char* buffer = "";
 scanf("%s",buffer);
 printf("%s",buffer);

上記のコードでは、バッファにメモリを割り当てていないため、バッファにメモリを割り当て、値をバッファに読み込みます。

于 2013-01-10T05:05:15.827 に答える
0

読み取る可能性のあるバイト数がわからないため、それに応じてメモリを割り当てます。したがって、ループで入力を取得し、バッファに追加する必要があると思います。

于 2013-01-10T05:21:37.063 に答える
0
char* buffer;

buffer = malloc(sizeof(char) * 1024); // 1024 is max user input length, or use whatever you want..

scanf("%s", buffer);

buffer = realloc (buffer, strlen(buffer) + 1); // re-allocating the buffer according  to user input..( + 1 for counting NULL character)

printf("%s",buffer);
于 2013-01-10T06:23:30.767 に答える