解析gets、fgtes、scanf三者的区别
来源:互联网 发布:做过加工中心学编程 编辑:程序博客网 时间:2024/04/28 16:32
作者:华清远见讲师
三者都可以从标准输入读取字符,但是使用容易混淆
可以用下面程序进行验证:
#include
#include
#define N 10
int main(int argc, char *argv[])
{
int i;
char buf[N];
for(i=0 ;i
buf[i] = 0x11;
}
while (1) {
gets(buf);
// scanf("%s", buf);
// fgets(buf, N, stdin);
printf("len = %d\n", strlen(buf));
for(i=0 ;i
printf("0x%x ", buf[i]);
}
printf("\n\n");
}
return 0;
}
gets是从标准输入读入一行,遇到换行符停止并且把换行符替换为'\0';
上面程序如果输入'ab'并敲入回车结束,那么打印结果为:
ab
len = 2
0x61 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可见最后的换行被替换为'\0'字符,所以strlen输出为2
fgets也是从标准输入读入一行,但是它会保留换行符然后在换行符后边加入'\0';
上面程序使用fgets,输入'ab'并敲入回车结束,那么打印结果为:
ab
len = 3
0x61 0x62 0xa 0x0 0x11 0x11 0x11 0x11 0x11 0x11
0xa是换行符的ascii码值,由此可见最后的换行被保留了,所以strlen输出为3
scanf和gets很像,但是它以空格或者换行为结束
例如对于gets,输入“a b”输出如下:
a b
len = 3
0x61 0x20 0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11
但是对于scanf输入如下:
a b
len = 1
0x61 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
len = 1
0x62 0x0 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11
由此可见,scanf遇到第一个空格就已经结束了第一次读取,因为缓冲区还有一个b,所以第二次读取立马进行了。
- 解析gets、fgtes、scanf三者的区别
- gets 和 scanf的 区别
- gets()与scanf()的区别
- gets和scanf的区别。
- scanf()、gets()、getchar()的区别
- gets与scanf的区别
- gets()与scanf()的区别
- gets和scanf的区别
- gets与scanf的区别
- gets()和scanf的区别
- scanf和gets的区别
- scanf getchar gets 的区别
- scanf和gets的区别
- gets和scanf的区别
- scanf和gets的区别
- gets 与 scanf 的区别
- scanf和gets的区别
- gets()和scanf的区别
- The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=403, text=\"ACCESS_RE
- 委托和事件(三)--事件详解
- java的System.getProperty()方法可以获取的值
- not found for architecture arm64
- 在粒子滤波中用到的两个重要的贝叶斯公式
- 解析gets、fgtes、scanf三者的区别
- 2,HTK学习_基于HTK语音工具包进行孤立词识别的使用教程
- JavaMail发送qq邮件
- 一些很棒的游戏推荐
- 高阶函数及闭包
- css隐藏多余字
- Mybatis自动生成dao,mapping,model文件
- 统计每年每月每日数据
- Linux下NFS服务器搭建