0

fgets()単純に行を読み取って改行を削除するために使用したい。これは、Windows と UN*X の両方で、すべてのケースで機能しますか?

fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");

GNU の getline() のような非標準のものは推奨しないでください。前もって感謝します!

4

3 に答える 3

4

いいえ、クロスプラットフォームが必要な場合は、適切に実行してください。

fgets (buf, sizeof (buf), stdin);
if (strlen (buf) > 0)
    if (buf[strlen (buf) - 1] == '\n')
        buf[strlen (buf) - 1] = '\0';

Windows で作成されたファイルを UNIXで読み取るときに問題が発生する可能性がありますが(たとえば)、標準入力を変更するという本来の目的には問題ありません。

への複数の呼び出しが心配な場合strlen:

fgets (buf, sizeof (buf), stdin);
{
    size_t len = strlen (buf);
    if (len > 0)
        if (buf[len - 1] == '\n')
            buf[len - 1] = '\0';
}

ちなみに、改行の削除、バッファオーバーフローの検出、余分な行のクリーンアップを行い、標準 C のみを使用する堅牢な行入力ソリューションを探している場合は、この回答をご覧ください。

于 2013-03-15T04:10:34.117 に答える
2

いいえ、改行の内部(解釈)表現は常に'\n'です。それで:

 strtok(buf, "\n");

一般に、改行変換が自動的に機能するには、ファイルをテキストモードで開く必要があります。

 text = fopen("text", "r"); // Conversion works
 binary = fopen("binary", "rb"); // Won't work
于 2013-03-15T04:21:31.687 に答える
0

みんなありがとう。このラッパーを書くことになった:

void
getstr(char *s, size_t n)
{
    int c;

    if (fgets(s, n, stdin) != NULL) {
        if (s[strlen(s) - 1] == '\n')
            s[strlen(s) - 1] = '\0';
        else
            while ((c = getchar()) != EOF && c != '\n')
               ;
    }
}
于 2013-03-15T06:41:53.297 に答える