1、gets()
gets()
是从标准输入读入字符,并保存到 s
指定的内存空间,直到出现换行符或读到文件结尾为止。代码如下,
#include <stdio.h>
/*
char *gets(char *s);
参数
s:字符串首地址
返回值
成功:读入的字符串
失败:NULL
*/
int main()
{
char str[1000];
printf("请输入一个字符串:");
gets(str);
printf("输入的字符串是:%s", str);
return(0);
}
gets(str)与 scanf("%s",str)的区别:
gets(str)
允许输入的字符串含有空格,canf(“%s”,str)
不允许含有空格。
2、fgets()
fgets()
是从 stream 指定的文件内读入字符,保存到 s
所指定的内存空间,
直到出现换行字符、 读到文件结尾或是已读了 size - 1
个字符为止,
最后会自动加上字符 ‘\0’
作为字符串结束。代码如下,
#include <stdio.h>
#include <string.h>
/*
char *fgets(char *s, int size, FILE *stream);
参数
s:字符串
size:指定最大读取字符串的长度(size - 1)
stream:文件指针,如果读键盘输入的字符串,固定写为 stdin
返回值
成功:成功读取的字符串读到文件尾
出错:NULL。
*/
int main()
{
int count = 10;
char str[10];
FILE *fp;
fp = fopen("file.txt","w+");
fputs("www.cjavapy.com\n", fp);
fputs("Filename file.txt\n", fp);
rewind(fp);
while(feof(fp) == 0)
{
fgets(str,count,fp);
printf(str);
}
fclose(fp);
return 0;
}
3、gets()和fgets()区别
gets
从标准输入读取,fgets
从指定的流读取。fgets必须指定缓冲区的长度 size
,此函数一直读到下一个换行符为止,但是不超过 size - 1 个字符,读入的字符被送入缓冲区,该缓冲区以null字节结尾。如若该行包含最后一个换行符的字符数超过size - 1
,则fgets
只返回一个不完整的行,但是缓冲区总是以null
字节结尾,对fgets
的下一个调用继续读该行。代码如下,
#include <stdio.h>
#include <string.h>
#define NUM 8
int main(void)
{
char str1[NUM] = {'C', 'J', 'A', 'V', 'A','P','Y'};
char str2[NUM] = {'C', 'J', 'A', 'V', 'A','P','Y'}; //使用特定字符填充缓冲区
fgets(str1, NUM, stdin);
printf("len = %d str1 = %s\n", (int)strlen(str1) ,str1);
for(int i=0; i<NUM; i++)
{
if(str1[i] == '\0')
printf("str1[%d] %d %s\n", i, (int)str1[i], "null"); //null字节
else if(str1[i] == '\n')
printf("str1[%d] %d %s\n", i, (int)str1[i], "\\n"); //换行符
else
printf("str1[%d] %d %c\n", i, (int)str1[i], str1[i]);
}
gets(str2);
printf("len1 = %d str2 = %s\n", (int)strlen(str2) ,str2);
if((int)strlen(str2) + 1 > NUM) //加 1 的目的是把 null字节输出出来
{
for(int i=0; i<(int)strlen(str2) + 1; i++) //加 1 的目的是把 null字节输出出来
{
if(str2[i] == '\0')
printf("str2[%d] %d %s\n", i, (int)str2[i], "null"); //null字节
else if(str2[i] == '\n')
printf("str2[%d] %d %s\n", i, (int)str2[i], "\\n"); //换行符
else
printf("str2[%d] %d %c\n", i, (int)str2[i], str2[i]);
}
}
else //输入字节数小于 5
{
for(int i=0; i<NUM; i++)
{
if(str2[i] == '\0')
printf("str2[%d] %d %s\n", i, (int)str2[i], "null"); //null字节
else if(str2[i] == '\n')
printf("str2[%d] %d %s\n", i, (int)str2[i], "\\n"); //换行符
else
printf("str2[%d] %d %c\n", i, (int)str2[i], str2[i]);
}
}
return 0;
}