鸟语天空
fgets()
post by:追风剑情 2019-10-20 22:30

示例一

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define STLEN 14

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	char words[STLEN];
	puts("Enter a string, please.");
	/*
	fgets()函数通过第2个参数限制读入的字符数来解决溢出的问题。
	该函数专门设计用于处理文件输入,所以一般情况下可能不太好用。
	fgets()和gets的区别如下:
	1. fgets()函数的第2个参数指明了读入的字符的最大数量。如果该参数的
	值是n,那么fgets()将读入n-1个字符,或者读到遇到第一个换行符为止。
	2. fgets()读到一个换行符,会把它储存在字符串中。这点与gets()不同,
	gets()会丢弃换行符。
	3. fgets()函数的第3个参数指明要读入的文件。如果读入从键盘输入的数据,
	则以stdin(标准输入)作为参数,该标识符定义在stdio.h中
	*/
	//fgets()只会读取STLEN-1个字符,或者读到第一个换行符,并在后面追加\0
	fgets(words, STLEN, stdin);
	printf("Your string twice (puts(), then fputs()):\n");
	//puts()在输出时会自动追加换行符\n
	puts(words);
	/*
	fputs()在输出时不会自动追加换行符\n
	fputs()函数返回指向char的指针。如果一切进行顺利,该函数
	返回的地址与传入的第1个参数相同。但是,如果函数读到文件
	结尾,它将返回一个特殊的指针:空指针(null pointer)。该
	指针保证不会指向有效数据,所以可以用于标识这种特殊情况。
	在代码中,可以用数字0来代替,不过在C语言中用宏NULL来代替
	更常见(如果在读入数据时出现某些错误,该函数也返回NULL)。
	*/
	fputs(words, stdout);
	puts("Enter another string, please.");
	fgets(words, STLEN, stdin);
	printf("Your string twice (puts(), then fputs()):\n");
	puts(words);
	fputs(words, stdout);
	puts("\nDone.");

	//通常gets()与puts()配对使用
	//通常fgets()与fputs()配对使用

	system("pause");
	return 0;
}

运行测试
1111.png

示例二

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define STLEN 10

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	char words[STLEN];
	puts("Enter strings (empty line to quit): ");
	//迭代读取当前行
	//在用户按下回车键之前,输入都被储存在临时存储区(即,缓冲区)
	//按下回车键时,整行输入才被发送给fgets()
	while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
		//对于输出,fputs()把字符发送给另一个缓冲区,当发送换行符时,
		//缓冲区中的内容被发送至屏幕上。
		fputs(words, stdout);
	puts("Done.");

	//处理掉换行符方式
	/*
	int i = 0;
	while (words[i] != '\n')
		i++;
	words[i] = '\0';
	*/

	//丢弃输入行中多余字符
	//while (getchar() != '\n')
		//continue;

	system("pause");
	return 0;
}

运行测试
1111.png

示例三

//Visual Studio中加上这句才可以使用scanf()
//否则只能使用scanf_s()
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

#define STLEN 10

//argc: 参数个数 argv[]: 参数数组
int main(int argc, char *argv[])
{
	char words[STLEN];
	int i;

	puts("Enter strings (empty line to quit): ");
	while (fgets(words, STLEN, stdin) != NULL && words[0] != '\n')
	{
		i = 0;
		while (words[i] != '\n' && words[i] != '\0')
			i++;
		if (words[i] == '\n')
			words[i] = '\0';
		else //如果word[i] == '\0'则执行这部分代码
			while (getchar() != '\n')
				continue;
		puts(words);
	}
	puts("Done.");

	system("pause");
	return 0;
}

运行测试
1111.png

空字符和空指针

      从概念上看,两者完全不同。空字符('\0')是用于标记C字符串末尾的字符,其对应字符编码是0。由于其他字符的编码不可能是0,所以不可能是字符串的一部分。

      空指针(或NULL)有一个值,该值不会与任何数据的有效地址对应。通常,函数使用它返回一个有效地址表示某些特殊情况发生,例如遇到文件结尾或未能按预期执行。

      空字符是整数类型,而空指针是指针类型。两者有时容易混淆的原因是:它们都可以用数值0来表示。但是,从概念上看,两者是不同类型的0。另外,空字符是一个字符,占1字节;而空指针是一个地址,通常占4字节。

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容