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; }