web-dev-qa-db-ja.com

fgetsを使用して改行を含めずに入力から文字列を取得するにはどうすればよいですか?

入力文字列を別の場所に書き込もうとしていますが、stdinおよびfgetsで取得したこの文字列の一部として表示される新しい行をどのように削除するのかわかりません。

 char buffer[100];
 memset(buffer, 0, 100);
 fgets(buffer, 100, stdin);
 printf("buffer is: %s\n stop",buffer);

Fgetsが取得するデータの量を制限するとともに、書き込まれるデータの量を制限しようとしましたが、新しい行は残っています。入力された文字列を、何も書かれていない最後の文字まで単純に取得するにはどうすればよいですか?

11

試す

fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
    buffer[ln] = '\0';
4
madz

潜在的な_'\n'_を探してください。

fgets()を呼び出した後、_'\n'_が存在する場合、それは文字列内の最後のcharになります(_'\0'_の直前)。

_size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}
_

使用例

_char buffer[100];
// memset(buffer, 0, 100); not needed
if (fgets(buffer, sizeof buffer, stdin) == NULL) { // good to test fgets() result
  Handle_EOForIOerror();
}
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
  buffer[--len] = '\0';
}
printf("buffer is: %s\n stop",buffer);
_

ノート:

buffer[strlen(buffer)-1]は、charの最初のbufferが_'\0'_(埋め込まれたnull文字)である場合にまれに危険です。

最初のcharが_'\n'_であり、何も読み取られず、_'\n'_がstdinに残っている場合、scanf("%99[^\n]%*c", buffer);は問題になります。

strlen()は他のメソッドと比較して高速です: https://codereview.stackexchange.com/a/67756/29485

または _gets_sz_ のような独自のコードをロールします