【问题标题】:C puts() without newlineC puts() 没有换行符
【发布时间】:2013-06-18 19:03:26
【问题描述】:

我目前有一个在控制台上打印文本文件的程序,但每一行下面都有一个额外的新行。 如果文本是

你好 世界

它会输出 你好

世界

代码是这样的

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    FILE* fp;
    char input[80], ch = 'a';
    char key[] = "exit\n";
    int q;

    fp = fopen("c:\\users\\kostas\\desktop\\original.txt", "r+");

    while (!feof(fp)) {
        fgets(input, 80, fp);
        puts(input);
    }
    fclose(fp);

    return 0;
}

【问题讨论】:

    标签: c file newline puts


    【解决方案1】:

    通常会使用 fputs() 而不是 puts() 来省略换行符。在您的代码中,

    puts(input);
    

    会变成:

    fputs(input, stdout);
    

    【讨论】:

    • 您也可以使用 printf(),但会增加少量开销 :-)
    • 我很高兴我找到了这个答案,因为我不想有printf的开销
    • 事实上,printf("%s", s) 没有 fputs(input, stdout) 的开销,但 fputs 看起来很干净。
    • printf("%s", s) 必须解析格式字符串,这绝对比系统调用的开销要小——但是您见过解析格式字符串的代码吗?这绝对是开销。 q.v. code.woboq.org/userspace/glibc/stdio-common/…
    【解决方案2】:

    puts() 按库规范添加换行符。您可以改用printf,在这里您可以控制使用格式字符串打印的内容:

    printf("%s", input);
    

    【讨论】:

    • 那个 "%s" 而不是仅仅使用 "printf(input);"很关键,以免输入中的任何百分号使您的程序崩溃。
    • 用 "%s" 调用 printf 的效率不如 fputs,但你可能不在乎
    • @portforwardpodcast 编译器确实将 printf("%s",sting) 更改为 fputs(string,stdout),当您启用优化时,至少 gcc 会这样做。某些编译器可能会将其更改为 fwrite() 当您知道字符串长度时会更快。
    • 为什么不直接使用下面的答案?
    • @12431234123412341234123 这是什么时候做的?我没有看到任何可用的 GCC 版本都完成了这种转换。我认为主要问题是在优化时获得标准输出。
    【解决方案3】:

    你也可以写一个自定义的puts函数:

    #include <stdio.h>
    
    int my_puts(char const s[static 1]) {
        for (size_t i = 0; s[i]; ++i)
            if (putchar(s[i]) == EOF) return EOF;
    
        return 0;
    }
    
    int main() {
        my_puts("testing ");
        my_puts("C puts() without ");
        my_puts("newline");
    
        return 0;
    }
    

    输出:

    testing C puts() without newline
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多