fgets()単純に行を読み取って改行を削除するために使用したい。これは、Windows と UN*X の両方で、すべてのケースで機能しますか?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
GNU の getline() のような非標準のものは推奨しないでください。前もって感謝します!
fgets()単純に行を読み取って改行を削除するために使用したい。これは、Windows と UN*X の両方で、すべてのケースで機能しますか?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
GNU の getline() のような非標準のものは推奨しないでください。前もって感謝します!
いいえ、クロスプラットフォームが必要な場合は、適切に実行してください。
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 のみを使用する堅牢な行入力ソリューションを探している場合は、この回答をご覧ください。
いいえ、改行の内部(解釈)表現は常に'\n'です。それで:
 strtok(buf, "\n");
一般に、改行変換が自動的に機能するには、ファイルをテキストモードで開く必要があります。
 text = fopen("text", "r"); // Conversion works
 binary = fopen("binary", "rb"); // Won't work
    みんなありがとう。このラッパーを書くことになった:
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')
               ;
    }
}