一、fgets
char *fgets ( char * str, int num, FILE * stream );
说明:从stream所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满num-1个字符时,已读到换行符或EOF(文件结束标志)则结束本次读操作且读入的字符串尾包含读到的换行符。读入结束后,系统将自动在最后加'\0'。
返回值: 若成功则返回s指针,失败返回NULL
A:Stream 可以是文件指针也可以为stdin
B: 在未读满num-1个字符时已读到换行符,则读入的字符串尾可能包含读到的换行符
C: fgets最多只能读入num-1个字符,将自动在最后加'\0',并以str作为函数值返回
/* fgets example */
#include <stdio.h>
intmain()
{
FILE * pFile;
char mystring [100];
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) perror ("Erroropening file");
else {
if ( fgets (mystring , 100 , pFile) != NULL )
puts (mystring);
fclose (pFile);
}
return 0;
}
二、gets
char * gets ( char * buffer);
说明:从stdin流中读取字符串直到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。读取结果中不包含换行符(读取的换行符被转换为null值,并由此来结束字符串)
返回值: 若成功则返回s指针,失败返回NULL
A: gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以保证不发生溢出
B: 如果溢出,多出来的字符将被写入到堆栈中,将覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值
C: 读取结果中不包含换行符
D: 如果不发生溢出则将自动在最后加'\0',并以str作为函数值返回
安全
gets因没有限制输入缓冲区大小,如果输入的字符大于定义的数组长度,会发生内存越界,堆栈溢出
fgets会指定大小,如果超出数组大小,会自动根据定义数组的长度截断
长度
在未读满缓冲区时,遇到换行符fgets将读取换行符保存在结果中,gets的结果在不包含换行符。
fgets取代get时须注意处理换行符
charline[10];
//gets(line)
fgets(line,sizeof(line),stdin);
if(line[strlen(line) - 1] == '\n') line[ strlen(line) - 1] = '\0';
/* gets example */
#include <stdio.h>
int main()
{
char string[256];
printf ("Insert your full address: ");
gets (string);
printf ("Your address is: %s\n",string);
return 0;
}
三、scanf
int scanf(const char*format,。。。。。)
返回值: 成功则返回参数数目,失败则返回-1
参数size---允许输入的数据长度
l ---以long int或double型保存
h ---short int型保存
s ---字符串
c ---字符
/*scan_str.c -- using scanf() */
#include<stdio.h>
intmain(void)
{
char name1[11], name2[11];
int count;
printf("Please enter 2names./n");
count = scanf("%5s %10s",name1,name2);
printf("I read the %d names %s and%s./n",
count, name1, name2);
return 0;
}