readline
大学の課題では、演習でC関数を使用することが提案されました。その参照を検索しましたが、まだ見つかりません。それは本当に存在しますか?どのヘッダーに?参考文献へのリンクを投稿していただけますか?
5 に答える
Readlineは2つの場所に存在し、libreadline
(とlibedit
も呼ばれlibeditline
ます)。どちらも同じインターフェースを持っています。違いは、libreadlineはGPLの下でライセンスされており、libeditは3節BSDです。ライセンスは実際には割り当ての問題ではありません、少なくとも私はそうは思わない。どちらのライセンスでも、コードを自由に使用できます。readlineに対してリンクする場合はGPL 2 or later
、システムを管理するGPLのバージョンに関係なく満たされるプログラム全体を作成するようにしてreadline
ください。システムの使用年数に応じて、GPL2+またはGPL3+の場合があります。私はどちらのライセンスも支持していません、それはあなた次第です。
/またはのいずれかをインストールし、必要に応じてリンクを調整するように注意してください(-lreadline
または -ledit
または -leditline
)。どちらもライブラリであり、標準Cライブラリの一部ではありません。
編集(後付け):
プログラムを公開する場合は、ユーザーが選択したプログラムを構成できるようにするための優れたジェスチャーですreadline
。たとえば、:--with-readline
または--with-libedit
など。これにより、少なくとも関連する限り、ライセンスの選択に準拠するバイナリパッケージが可能になりますreadline
。
リンク:ReadlineおよびEdit/Editline。
標準機能ではないと思います。
簡単な実装は次のようになります。
char * Readline(char * in){ char * cptr; if(cptr = fgets(in、MAX_LINE、stdin)){ / *前の空白を削除しますが、\ nを残すので、何かがあることが保証されます while(* cptr =='' || * cptr =='\ t'){ cptr ++; } cptrを返します。 } そうしないと { 0を返します。 } }
fgets()を使用して、最大MAX_LINE-1文字をバッファ'in'に読み込みます。先行する空白を取り除き、最初の非空白文字へのポインタを返します。
Java-BufferedReaderのreadLine()のような「readLine()」関数が必要な場合は、「line.h」で私の関数«char * get_line(FILE * filePointer)»を自由に使用することもできます。この目的:https ://github.com/pheek/line.h/blob/master/line.h
GNU Cライブラリからこれを読んでみたかどうかはわかりません:ssize_t getline (char **lineptr, size_t *n, FILE *stream)
。この関数はファイルから行を読み取り、必要に応じてさらに多くのスペースを再割り当てすることもできます。
この例は、getlineのマンページにあります。以下はそのコピーです。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
FILE *stream;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if (argc != 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
stream = fopen(argv[1], "r");
if (stream == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
while ((nread = getline(&line, &len, stream)) != -1) {
printf("Retrieved line of length %zu:\n", nread);
fwrite(line, nread, 1, stdout);
}
free(line);
fclose(stream);
exit(EXIT_SUCCESS);
}
存在しません。
それらは誤っており、stdio.hからgets()を参照していました。
また、これは、パラメーターを読み取る最大サイズがないため、非常に危険な機能であり、即時のセキュリティ全体になります(ルックアップバッファーオーバーラン攻撃)。代わりにfgets()を使用できます。