C puts()没有换行符

Con*_*ine 25 c newline file puts

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

你好,世界

它会输出你好

世界

代码是这样的

#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;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*eys 48

Typically one would use fputs() instead of puts() to omit the newline. In your code, the

puts(input);
Run Code Online (Sandbox Code Playgroud)

would become:

fputs(input, stdout);
Run Code Online (Sandbox Code Playgroud)

  • 我很高兴找到这个答案,因为我不想有`printf`的开销。 (3认同)
  • `printf("%s", s)` 必须解析格式字符串,这肯定比系统调用的开销要少 - 但是您*见过*用于解析格式字符串的代码吗?这绝对是开销。qv https://code.woboq.org/userspace/glibc/stdio-common/vfprintf-internal.c.html (3认同)
  • 您也可以使用printf(),但需要少量额外开销:-) (2认同)

das*_*ght 9

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

printf("%s", input);
Run Code Online (Sandbox Code Playgroud)

  • 那个"%s"而不只是使用"printf(输入);" 是至关重要的,以免任何百分号输入崩溃你的程序. (7认同)
  • 使用"%s"调用printf的效率低于fputs,但您可能并不在意 (3认同)
  • @portforwardpodcast编译器确实将 printf("%s",sting) 更改为 fputs(string,stdout),当您启用优化时,至少 gcc 会这样做。有些编译器可能会将其更改为 fwrite() ,当您知道字符串长度时,它会更快。 (2认同)

Fer*_*ezi 5

您还可以编写自定义的put函数:

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

testing C puts() without newline
Run Code Online (Sandbox Code Playgroud)