使用fgets如何从输入中获取不包括换行符的字符串?

13

我想在其他地方写入一个输入的字符串,但不知道如何去掉这个字符串中作为stdin和fgets一部分出现的换行符。

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

我试图限制fgets获取的数据量以及限制写入的数据量,但是换行符仍然存在。如何仅仅获取输入字符串直到最后一个字符而没有其他内容?


scanf("%99[^\n]%*c", buffer); - BLUEPIXY
如果第一个字符是 '\n',那么 @BLUEPIXY 的 scanf("%99[^\n]%*c", buffer) 将不会读取任何内容到 buffer 中。'\n' 会留在 stdin 中。 - chux - Reinstate Monica
2
你想读取一行并保留输入流中的 '\n',还是想读取包括 '\n' 的一行,然后将 '\n' 丢弃?(这将影响下一个输入操作,它将或将不会看到等待它的 '\n'。) - Keith Thompson
2个回答

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

5

只需寻找可能的'\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] 在极少数情况下可能存在危险,当buffer中的第一个char'\0'(嵌入的空字符)时。

scanf("%99[^\n]%*c", buffer); 如果第一个char'\n',那么就什么也不会读取,'\n' 仍然留在 stdin 中。

strlen() 相对于其他方法来说速度很快:https://codereview.stackexchange.com/a/67756/29485

或者像gets_sz一样自己编写代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接