入力文字列を別の場所に書き込もうとしていますが、stdinおよびfgetsで取得したこの文字列の一部として表示される新しい行をどのように削除するのかわかりません。
char buffer[100];
memset(buffer, 0, 100);
fgets(buffer, 100, stdin);
printf("buffer is: %s\n stop",buffer);
Fgetsが取得するデータの量を制限するとともに、書き込まれるデータの量を制限しようとしましたが、新しい行は残っています。入力された文字列を、何も書かれていない最後の文字まで単純に取得するにはどうすればよいですか?
試す
fgets(buffer, 100, stdin);
size_t ln = strlen(buffer)-1;
if (buffer[ln] == '\n')
buffer[ln] = '\0';
潜在的な_'\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
_ のような独自のコードをロールします