我想用fgets()
来简单地读一行并去掉换行符。这是否适用于Windows和UN * X上的所有情况?跨平台使用fgets()?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
请不要推荐非标准的东西,比如GNU的getline()。提前致谢!
我想用fgets()
来简单地读一行并去掉换行符。这是否适用于Windows和UN * X上的所有情况?跨平台使用fgets()?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
请不要推荐非标准的东西,比如GNU的getline()。提前致谢!
没有,如果你想跨平台,做正确:
您可以在运行问题读数窗创建于UNIX 文件时(例如),但会为工作的预期目的,修改标准输入。
如果你担心多次调用strlen
:
fgets (buf, sizeof (buf), stdin);
{
size_t len = strlen (buf);
if (len > 0)
if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
}
顺便说一句,如果你正在寻找一个强大的线路输入解决方案,它不换行去除,缓冲区溢出检测,多余的行清理,只使用标准C,你应该看看this answer。
不,新行的内部(解释)表示总是'\ n'。所以:
strtok(buf, "\n");
一般情况下,一个文件需要在文本模式下被打开并换行转换为自动工作:
text = fopen("text", "r"); // Conversion works
binary = fopen("binary", "rb"); // Won't work
双倍于'stdin',这应该是文本模式(对于那些作出区分的操作系统)。 – paxdiablo 2013-03-15 04:32:11
谢谢,伙计们。结束写这个包装:
void
getstr(char *s, size_t n)
{
int c;
if (fgets(s, n, stdin) != NULL) {
if (s[strlen(s) - 1] == '\n')
s[strlen(s) - 1] = '\0';
else
while ((c = getchar()) != EOF && c != '\n')
;
}
}
不会在字符串的末尾留下一个'\ r'在Windows的情况下,结束每行'\ r'后跟'\ n'?另外,为什么有必要用if语句和两个对strlen()的调用来将单个调用替换为strtok()? – Derek 2013-03-15 04:12:40
@Derek,不,Windows在输入行时(至少对于文本文件)不会在行的末尾放置'\ r'。对于文件,实施需要处理翻译。在stdin的情况下,由于没有办法来自不同平台的输入,所以你的麻烦更小:-)尝试一下,亲自查看。如果你担心性能,你可以缓存'strlen'的结果,但现代编译器往往会使这不必要。 – paxdiablo 2013-03-15 04:14:22
为什么我上面的代码不正确? – Derek 2013-03-15 04:18:36