返回首页
EN
H7 / SECURITY RESEARCH NOTES

第14章 结构和其他数据形式

  • 注:如果要用结构存储字符串,用字符数组作为成员比较简单。用指向char的指针也行,但是误用会导致严重的问题。(所以保险就用字符数组吧)

14.7.7小节的代码出现了问题,代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SLEN 81
struct namect {
	char* fname;
	char* lname;
	int letters;
};

void getinfo(struct namect*);
void makeinfo(struct namect*);
void showinfo(const struct namect*);
void cleanup(struct namect*);
char* s_gets(char* st, int n);

int main(void)
{
	struct namect person;

	getinfo(&person);
	makeinfo(&person);
	showinfo(&person);
	cleanup(&person);

	return 0;
}

void getinfo(struct namect* pst)
{
	char temp[SLEN];

	printf("Please enter your first name.\n");
	s_gets(temp, SLEN);
	// 分配内存以存储名
	pst->fname = (char*)malloc(strlen(temp) + 1);
	// 把 first name 拷贝到动态分配的内存中
	if (pst->fname != NULL)
		strcpy_s(pst->fname, sizeof(pst->fname), temp);

	printf("Please enter your last name.\n");
	s_gets(temp, SLEN);
	pst->lname = (char*)malloc(strlen(temp) + 1);
	if (pst->lname != NULL)
		strcpy_s(pst->lname, sizeof(pst->lname), temp);
}

void makeinfo(struct namect* pst)
{
	pst->letters = strlen(pst->fname) + strlen(pst->lname);
}

void showinfo(const struct namect* pst)
{
	printf("%s %s, your name contains %d letters.\n", pst->fname, pst->lname,
		pst->letters);
}

void cleanup(struct namect* pst)
{
	free(pst->fname);
	free(pst->lname);
}

char* s_gets(char* st, int n)
{
	char* ret_val; // 该指针用于保存读取的字符串的字符首地址
	char* find;	//	用于保存从字符串中找到的换行符'\n'的地址

	ret_val = fgets(st, n, stdin);
	if (ret_val)
	{
		find = strchr(st, '\n');
		if (find)
			*find = '\0';
		else
			while (getchar() != '\n')
				continue;
	}

	return ret_val;
}
  • 报错如下:

  • 2022.1.5(先挖个坑,目前暂时解决不了该问题,后续回来看)

typedef

  • typedef定义中通常用大写字母表示被定义的名称,以提醒用户这个类型实际上是一个符号缩写。

函数和指针

  • 如果想声明一个指向某类型函数的指针,可以写出该函数的原型后把函数名替换成(*pf)形式的表达式。然后,pf就成为该类型函数的指针了。