下面是一种快速的方法,用于从由
fgets()
保存的字符串中删除潜在的
'\n'
。它使用
strlen()
进行两次测试。
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin) != NULL) {
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[--len] = '\0';
}
现在根据需要使用
buffer
和
len
。
这种方法的附带好处是后续代码中有一个
len
值。它可以比
strchr(Name, '\n')
更容易更快地实现。
Ref 个人情况可能有所不同,但两种方法都有效。
buffer
,从原始的fgets()
在某些情况下不会包含"\n"
:
A)行对于buffer
来说太长,所以只有'\n'
之前的char
保存在buffer
中。未读的字符保留在流中。
B)文件中的最后一行没有以'\n'
结尾。
如果输入中嵌入了空字符'\0'
,strlen()
报告的长度将不包括'\n'
的位置。
一些其他答案的问题:
1.
strtok(buffer, "\n");
在buffer
为"\n"
时无法移除'\n'
。根据这个答案 - 在这个答案之后进行了修改以警告这个限制。
2.
当fgets()
读取的第一个char
为'\0'
时,以下代码在极少数情况下会失败。这种情况发生在输入以嵌入的'\0'
开头时。然后buffer[len - 1]
变成了buffer[SIZE_MAX]
,访问了肯定超出buffer
合法范围的内存。这是答案在撰写本答案时的状态。后来一个非OP编辑它,包括了本答案中检查""
的代码。
size_t len = strlen(buffer);
if (buffer[len - 1] == '\n') { // 当len == 0时失败
buffer[len -1] = '\0';
}
3.
sprintf(buffer,"%s",buffer);
是未定义行为:参考。此外,它不会保存任何前导、分隔或尾随的空格。现在已经删除。
4.
[由于后来的答案的好处进行编辑] 除了性能与strlen()
方法相比之外,1行代码buffer[strcspn(buffer, "\n")] = 0;
没有任何问题。在修剪方面,性能通常不是问题,因为代码正在进行I/O - 一个消耗CPU时间的黑洞。如果以下代码需要字符串的长度或对性能非常敏感,请使用strlen()
方法。否则,strcspn()
是一个很好的替代方法。
Name
,则执行以下操作:if (!fgets(Name, sizeof Name, stdin))
。(请注意不要使用两个否定词,即“!”和“!=”) - Roger Pateif (fgets(Name, sizeof Name, stdin) == NULL ) {
。 - R Sahu!
: - chux - Reinstate Monica