linux下的stdin,stdout和stderr理解

在这里插入图片描述

来源:微信公众号「编程学习基地」

linux下的stdin,stdout和stderr理解

在linux中经常会看到stdin,stdout和stderr,这3个可以称为终端(Terminal)的标准输入(standard input),标准输出( standard out)和标准错误输出(standard error)。

同时在Linux下查看/dev目录下的文件可以发现

➜  ~ ls -l /dev | grep std
lrwxrwxrwx  1 root root          15 Sep 23 00:29 stderr -> /proc/self/fd/2
lrwxrwxrwx  1 root root          15 Sep 23 00:29 stdin -> /proc/self/fd/0
lrwxrwxrwx  1 root root          15 Sep 23 00:29 stdout -> /proc/self/fd/1

同时可以将字符给/etc/stdout输出字符

~ echo "hello stdout" >> /dev/stdout
hello stdout~ 
标准输入(standard input)

在c语言中表现为调用scanf函数接受用户输入内容,即从终端设备输入内容。也可以用fscanf指明stdin接收内容。 标准输入的文件标识符为0

#include<stdio.h>
#include<string.h>
int main()
{
    char buf[1024];
    //C语言下标准输入
    scanf("%s",buf);
    //UNIX下标准输入 stdin 0
    fscanf(stdin,"%s",buf);
    //read不建议使用 标准输入必须为0不能为stdin
    read(0,buf,strlen(buf));
    return 0;
}
标准输出(standard out)

在c语言中表现为调用printf函数将内容输出到终端上。使用fprintf也可以把内容输出到终端上。标准输出的文件标识符为1

#include<stdio.h>
#include<string.h>
int main()
{
    char buf[1024];
    //C语言下标准输入 输出
    scanf("%s",buf);
    printf("buf:%s\n",buf);
    //UNIX下标准输入 stdin 0
    fscanf(stdin,"%s",buf);
    fprintf(stdout,"buf:%s\n",buf);
	//read,write不建议使用 
    //标准输入必须为0不能为stdin 标准输出必须为1不能为stdout
    read(0,buf,strlen(buf));
    write(1,buf,strlen(buf));
    return 0;
}
标准错误输出(standard error)

标准错误和标准输出一样都是输出到终端上, 标准错误输出的文件标识符为2

#include<stdio.h>
#include<string.h>
int main()
{
    char buf[1024]="error";
    fprintf(stderr,"%s\n",buf);

    write(2,buf,strlen(buf));
    return 0;
}

fgets和fscanf的区别

fgets原型:
char *fgets(char *s, int size, FILE *stream);

示例:

#include<stdio.h>
int main()
{
    char buf[128];
    fgets(buf,sizeof(buf),stdin);
    printf("%s",buf);
    printf("end\n");
    return 0;
}
➜  Desktop ./main          
dasdsad sadas
dasdsad sadas
end

结论:fgets能够获取一行输入的内容,包括换行符\n

fscanf原型:
int fscanf(FILE *stream, const char *format, ...);

示例:

#include<stdio.h>
int main()
{
    char buf[128];
    fscanf(stdin,"%s",buf);
    printf("%s",buf);
    printf("end\n");
    return 0;
}
➜  Desktop ./main 
hello world
helloend

结论:fscanf只能获取一串字符串,遇到空格结束,不包括换行符

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeRoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值