おそらく最も明白な方法で改行文字を削除する手順:
- header
NAME
を使用してstrlen()
、内部の文字列の長さを判別しstring.h
ます。strlen()
は終了をカウントしないことに注意してください\0
。
size_t sl = strlen(NAME);
- 文字列が1
\0
文字(空の文字列)で始まるか、または1つだけ含まれるかどうかを確認します。この場合sl
になります0
ので、strlen()
私は数えるdoesn't上に述べたように\0
、それの最初の発生時に停止します。
if(sl == 0)
{
// Skip the newline replacement process.
}
- 適切な文字列の最後の文字が改行文字かどうかを確認します
'\n'
。この場合は、に置き換え\n
てください\0
。インデックスカウントはで始まる0
ため、次のようにする必要があることに注意してくださいNAME[sl - 1]
。
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets()
文字列要求でEnterキーのみを押した場合(文字列の内容は改行文字のみで構成されていました)、NAME
その後の文字列は空の文字列になります。
- 私達はちょうど1のステップ2と3を一緒に組み合わせることができ
if
、論理演算子を使って-statement &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- 完成したコード:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
fgets
毎回再入力せずに一般的に出力文字列を処理することにより、この手法を使用する関数が好きな場合は、fgets_newline_kill
次のとおりです。
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
提供された例では、次のようになります。
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
入力文字列にが埋め込まれている場合、このメソッドは機能しないことに注意してください\0
。その場合strlen()
、最初の文字数までの文字数のみが返され\0
ます。しかし、これは一般的なアプローチではありません。ほとんどの文字列読み取り関数は通常、最初に停止するためです。\0
そのnull文字まで文字列を取得するためです。
それ自体の質問は別として。コードが不明確になる二重否定を回避するようにしてください:if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
。簡単にできますif (fgets(Name, sizeof Name, stdin) == NULL) {}
。
if (!fgets(Name, sizeof Name, stdin))
(少なくとも、2つの否定、!と!=は使用しないでください)