结构数组

作者:追风剑情 发布于:2020-1-15 14:17 分类:C

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

char* s_gets(char *st, int n);
#define MAXTITL 41 /* 书名的最大长度 + 1 */
#define MAXAUTL 31 /* 作者姓名的最大长度 + 1 */
#define MAXBKS 100 /* 书籍的最大数量 */

/* 声明结构(模板) */
struct book {
	char title[MAXTITL];
	char author[MAXAUTL];
	float value;
};

int main(int argc, char* argv[])
{
	/*
	分配的栈内存太多,可能会报栈溢出错误。可设置编译器选项增加栈大小。
	*/
	struct book library[MAXBKS]; // 声明结构体数组
	int count = 0;
	int index;
	
	printf("Please enter the book title.\n");
	printf("Press [enter] at the start of a line to stop.\n");
	while (count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL
		&& library[count].title[0] != '\0')
	{
		printf("Now enter the author.\n");
		s_gets(library[count].author, MAXAUTL);
		printf("Now enter the value.\n");
		//scanf()函数遇到空格或换行符就会结束读取
		scanf("%f", &library[count++].value);
		while (getchar() != '\n')
			continue; // 清理输入行
		if (count < MAXBKS)
			printf("Enter the next title.\n");
	}

	if (count > 0)
	{
		printf("Here is the list of your books:\n");
		for (index = 0; index < count; index++)
		{
			printf("%s by %s: $%.2f\n", library[index].title, 
				library[index].author, library[index].value);
		}
	}
	else 
	{
		printf("No books? Too bad.\n");
	}

	system("pause");
	return 0;
}

// 自己实现读取函数
char* s_gets(char* st, int n)
{
	char* ret_val;
	int i = 0;
	ret_val = fgets(st, n, stdin);
	if (ret_val) //即,ret_val != NULL
	{
		while (st[i] != '\n' && st[i] != '\0')
			i++;
		if (st[i] == '\n')
			st[i] = '\0';
		else
			while (getchar() != '\n')
				continue;
	}
	return ret_val;
}

运行测试

111.png

Borland C和浮点数
如果程序不使用浮点数,旧式的Borland C编译器会尝试使用小版本的scanf()来压缩程序,然而,如果在一个结构数组中只有一个浮点值,那么这种编译器(DOS的Borland C/C++ 3.1之前的版本,不是Borland C/C++ 4.0)就无法发现它存在。结果,编译器会生成如下消息:
scanf :floating point formats not linked
Abnormal program termination
一种解决方案是,在程序中添加下面的代码:
#include
double dummy = sin(0.0);
这段代码强制编译器载入浮点版本的scanf();

标签: C语言

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号