fgets()
是读取一行输入的安全函数,但它存储new line byte '\n'
如果适合,则从数组中的文件中读取。
在许多(如果不是大多数)情况下,这new line在进一步处理该行内容之前必须将其删除。
可以使用几种简单的方法来实现这一点,但我看到了一个紧凑而棘手的建议:
strtok(line, "\n"); // strip the newline
为什么这个方法不正确并且并不总是有效?
该方法很棘手,因为strtok()
函数对全局隐藏状态变量有副作用。这可能会影响周围的代码并且难以调试。
此外,还有一个简单的情况,strtok(line, "\n")
不会覆盖'\n'
带有空字节:如果读取的行fgets()
是一个空行,仅包含一个new line字节。对于这个内容,strtok()
将跳过初始的new line,搜索不存在的不同字符,然后返回NULL
not修改数组。因此它不会剥离new line.
这是不使用的令人信服的理由strtok(line, "\n")
剥离new line byte.
当然可以fix这个问题通过写:
if (*line == '\n')
*line = '\0';
else
strtok(line, "\n");
或者是一些繁琐的俏皮话:
(void)(*line == '\n' ? (*line = '\0') : (strtok(line, "\n"), 0);
if (!strtok(line, "\n")) *line = '\0';
(void)(strtok(line, "\n") || (*line = '\0'));
但代码不再紧凑,并且仍然有其他副作用。
还可以使用其他方法:
-
使用显式的for
陈述:
for (char *p = line; *p; p++) {
if (*p == '\n')
*p = '\0';
}
-
using strlen()
:
size_t len = strlen(line);
if (len > 1 && line[len - 1] == '\n') {
line[--len] = '\0';
}
// len is the length if the stripped line
-
using strchr()
:
char *p = strchr(line, '\n');
if (p) {
*p = '\0';
}
-
using strcspn()
一行:
line[strcspn(line, "\n")] = '\0'; // strip the newline if any.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)