2013-03-15 162 views
0

我想用fgets()来简单地读一行并去掉换行符。这是否适用于Windows和UN * X上的所有情况?跨平台使用fgets()?

fgets(buf, sizeof buf, stdin); 
strtok(buf, "\r\n"); 

请不要推荐非标准的东西,比如GNU的getline()。提前致谢!

回答

4

没有,如果你想跨平台,做正确:

您可以在运行问题读数窗创建于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

+1

不会在字符串的末尾留下一个'\ r'在Windows的情况下,结束每行'\ r'后跟'\ n'?另外,为什么有必要用if语句和两个对strlen()的调用来将单个调用替换为strtok()? – Derek 2013-03-15 04:12:40

+0

@Derek,不,Windows在输入行时(至少对于文本文件)不会在行的末尾放置'\ r'。对于文件,实施需要处理翻译。在stdin的情况下,由于没有办法来自不同平台的输入,所以你的麻烦更小:-)尝试一下,亲自查看。如果你担心性能,你可以缓存'strlen'的结果,但现代编译器往往会使这不必要。 – paxdiablo 2013-03-15 04:14:22

+0

为什么我上面的代码不正确? – Derek 2013-03-15 04:18:36

2

不,新行的内部(解释)表示总是'\ n'。所以:

strtok(buf, "\n"); 

一般情况下,一个文件需要在文本模式下被打开并换行转换为自动工作:

text = fopen("text", "r"); // Conversion works 
binary = fopen("binary", "rb"); // Won't work 
+0

双倍于'stdin',这应该是文本模式(对于那些作出区分的操作系统)。 – paxdiablo 2013-03-15 04:32:11

0

谢谢,伙计们。结束写这个包装:

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') 
       ; 
    } 
}