/*
#include<stdio.h>
#include<stdlib.h>
#define MAX 81
int main(void)
{
char name[MAX];
char *ptr;
printf("请输入姓名:\n");
ptr = fgets(name, MAX, stdin);
printf("%s? Ah! %s\n", name, ptr);
getchar();
return 0;
}
*/
/*********************************************************************************
请输入姓名:
qinshihuang
qinshihuang
? Ah! qinshihuang
出现了一个问题:理应问号在上一行,却怕跑到了下一行。
问题在于fgets() 把换行符存储到字符串里,这样每次显示字符时就会显示换行符。
我们可以使用strchr()来定位和删除换行符。
***********************************************************************************/
/*---------------------------------------------------------------------------------
gets() 对于交互式程序非常方便。因为没有字符串预定的长度,所以gets()不知道什么时候
结束。解决办法就是读字符串直到遇到一个换行字符(\n),按回车可以产生这个字符。他
读取换行符之前(不包括换行符)的所有字符,这些字符后添加了一个空字符<\0>,然后把这
个字符串交给调用它的程序。它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。
gets() 返回一个指向字符串首地址的指针。
由于gets()不检查目标数组是否能够容纳输入,所以很不安全。的确,几年前就有人注意到
NUIX操作系统中代码使用gets(),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码
,从而发明了在UNIX网络上传播的“蠕虫(worm)”.
///***fgets()和gets()有三方面不同:***
1.fgets()需要第二个参数来说明读入字符数。如果这个参数是n, fgets()就会读取最多n-1个字符
或者读完一个换行符为止,这由二者中最先满足的那个来结束输入。
2.如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。
3.他还需要第三个参数来说明读哪一个文件。从键盘上读取数据时,可以使用stdin(standard input)
作为参数,这个标识符在stdio.h中定义。
///***scanf()和gets()***
主要差别在于他们如何决定字符串的结束。
scanf()基于获取单词。gets()基于获取字符串。
scanf()使两种方法决定书输入结束:
1.如果使用%s 格式,那么遇到空白符结束,
2.若指定长度%10s,那么读到第10个结束。
二者先满足谁都结束输入。
gets()结束输入就一种:
遇到换行符。
gets() 更加适用于文本输入。scanf()适用于带有属性的变量输入(也即是有控制符)。
///***printf()和puts()***
puts()输出之后会自动在其后添加一个换行符。
fputs()和puts()
fputs() 下需要第二个参数说明要写的文件。使用stdout进行输出显示。
gets()丢弃输入里的换行符,puts()为输出添加换行符;
fgets()存储输入中的换行符,fputs()不为输出添加换行符。
假定写一个循环,读取一行并把它回显在下一行。
char line[80];
while(gets(line))
puts(line);
char line[80];
while(fgets(line))
fputs(line);
第一个循环中puts()为他添加了换行符,所以每一个数组中的字符都被显示在单独的一行上。
第二个循环中fgets()存储了一个换行符,所以二者输出效果相同。
-------------------------------------------------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 81
int main(void)
{
char name[MAX];
char *ptr;
printf("请输入姓名:\n");
ptr = fgets(name, MAX, stdin);
printf("%s? Ah! %s\n", name, ptr);
getchar();
return 0;
}
*/
/*********************************************************************************
请输入姓名:
qinshihuang
qinshihuang
? Ah! qinshihuang
出现了一个问题:理应问号在上一行,却怕跑到了下一行。
问题在于fgets() 把换行符存储到字符串里,这样每次显示字符时就会显示换行符。
我们可以使用strchr()来定位和删除换行符。
***********************************************************************************/
/*---------------------------------------------------------------------------------
gets() 对于交互式程序非常方便。因为没有字符串预定的长度,所以gets()不知道什么时候
结束。解决办法就是读字符串直到遇到一个换行字符(\n),按回车可以产生这个字符。他
读取换行符之前(不包括换行符)的所有字符,这些字符后添加了一个空字符<\0>,然后把这
个字符串交给调用它的程序。它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。
gets() 返回一个指向字符串首地址的指针。
由于gets()不检查目标数组是否能够容纳输入,所以很不安全。的确,几年前就有人注意到
NUIX操作系统中代码使用gets(),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码
,从而发明了在UNIX网络上传播的“蠕虫(worm)”.
///***fgets()和gets()有三方面不同:***
1.fgets()需要第二个参数来说明读入字符数。如果这个参数是n, fgets()就会读取最多n-1个字符
或者读完一个换行符为止,这由二者中最先满足的那个来结束输入。
2.如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。
3.他还需要第三个参数来说明读哪一个文件。从键盘上读取数据时,可以使用stdin(standard input)
作为参数,这个标识符在stdio.h中定义。
///***scanf()和gets()***
主要差别在于他们如何决定字符串的结束。
scanf()基于获取单词。gets()基于获取字符串。
scanf()使两种方法决定书输入结束:
1.如果使用%s 格式,那么遇到空白符结束,
2.若指定长度%10s,那么读到第10个结束。
二者先满足谁都结束输入。
gets()结束输入就一种:
遇到换行符。
gets() 更加适用于文本输入。scanf()适用于带有属性的变量输入(也即是有控制符)。
///***printf()和puts()***
puts()输出之后会自动在其后添加一个换行符。
fputs()和puts()
fputs() 下需要第二个参数说明要写的文件。使用stdout进行输出显示。
gets()丢弃输入里的换行符,puts()为输出添加换行符;
fgets()存储输入中的换行符,fputs()不为输出添加换行符。
假定写一个循环,读取一行并把它回显在下一行。
char line[80];
while(gets(line))
puts(line);
char line[80];
while(fgets(line))
fputs(line);
第一个循环中puts()为他添加了换行符,所以每一个数组中的字符都被显示在单独的一行上。
第二个循环中fgets()存储了一个换行符,所以二者输出效果相同。
-------------------------------------------------------------------------------------*/