我有这样的C代码:

#include<stdio.h>
int main()
{
    printf("Hey this is my first hello world \r");
    return 0;
}

我用了\r次逃逸序列作为实验.当我运行代码时,我得到的输出是:

o world

这是为什么呢?\r到底有什么用呢?

如果我在在线编译器中运行相同的代码,我会得到如下输出:

Hey this is my first hello world

为什么在线编译器会产生不同的输出,而忽略\r

推荐答案

\r是一个carriage return字符;它告诉您的终端仿真器在行首移动光标.

cursor是下一个字符的渲染位置.

因此,打印\r允许覆盖终端仿真器的当前行.

Tom Zych表示为什么您的程序的输出是o world,而\r在行尾,并且您在这之后不打印任何内容:

当程序退出时,shell打印命令提示符.终端会在光标离开的位置渲染它.程序将光标保留在行的开头,因此命令提示会部分覆盖打印的行.这解释了为什么命令提示符后面跟着o world.

您提到的online compiler只是将原始输出打印到浏览器.浏览器会忽略控制字符,因此\r无效.

https://en.wikipedia.org/wiki/Carriage_return

以下是\r的用法示例:

#include <stdio.h>
#include <unistd.h>

int main()
{
        char chars[] = {'-', '\\', '|', '/'};
        unsigned int i;

        for (i = 0; ; ++i) {
                printf("%c\r", chars[i % sizeof(chars)]);
                fflush(stdout);
                usleep(200000);
        }

        return 0;
}

它在同一位置重复打印字符- \ | /,以产生终端中旋转|的错觉.

C++相关问答推荐

当main函数调用被重构时,C函数给出错误的结果

C/SDL程序,渲染不使用我的渲染器

如何设置指针指向在函数中初始化的复合文字中的整数?

C:二进制搜索和二进制插入

为什么在此程序中必须使用Volatile关键字?

将常量转换为指针会增加.数据大小增加1000字节

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

为什么该函数不将参数值保存到数据 struct 中?

在我的代码中,我需要在哪里编写输出函数?

加密解密工作正常,但返回错误0x80090005

1处的解析器错误:yacc语法的语法错误

为什么将函数名括在括号中会禁用隐式声明?

从TCP连接启动UDP(C套接字)

判断系统命令返回值的正确方法

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

宏观;S C调深度

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

GDB 跳过动态加载器代码