菜鸟之家中的c语言从菜鸟到高手资料密码

后使用快捷导航没有帐号?
STM32入门-C语言中的结构体(辅助贴)
本帖最后由 蔡顺兴 于
22:24 编辑
C语言中的结构体
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。[1]
定义与声明
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。[1]
struct tag
member-list
} variable-
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。[1]
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。[1]
//此结构体的声明包含了其他的结构体
struct COMPLEX
& & char string[100];
& & struct SIMPLE
//此结构体的声明包含了指向自己类型的指针
struct NODE
& & char string[100];
& & struct NODE *next_
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:
struct B;& &
//对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
& & struct B *
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
& & struct A *
结构体作用
结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
2 C++中的结构体
在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private。
C++控制台输出例子:
#include&cstdlib&
#include&iostream&
//定义结构体
structpoint
//包含两个变量成员
int main(intargc,char*argv[])
& &//加上struct的结构体变量定义是C语言的特征,而C++语言不需要这样
& &pt.x=1;
& &pt.y=2;
& &cout&&pt.x&&endl&&pt.y&&
& &returnEXIT_SUCCESS;
C++中的结构体与类的区别
类与结构体在C++中有三点区别。[1]
(1)class中默认的成员访问权限是private的,而struct中则是public的。
(2)从class继承默认是private继承,而从struct继承默认是public继承。
(3)C++的结构体声明不必有struct关键字,而C语言的结构体声明必须带有关键字(使用typedef别名定义除外)。
这个对学STM32的人来说比较有用
Copyright &
Powered byC语言编程中从密码文件获取数据的函数总结
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言编程中从密码文件获取数据的函数总结,包括getpw()函数和getpwnam()函数以及getpwuid()函数,需要的朋友可以参考下
C语言getpw()函数:取得指定用户的密码文件数据
#include &pwd.h&
#include &sys/types.h&
定义函数:
int getpw(uid_t uid, char *buf);
函数说明:getpw()会从/etc/passwd中查找符合参数uid所指定的用户账号数据, 找不到相关数据就返回-1。
所返回的buf 字符串格式如下:
账号:密码:用户识别码(uid):组识别码(gid):全名:根目录:shell
返回值:返回 0 表示成功, 有错误发生时返回-1.
1. getpw()会有潜在的安全性问题, 请尽量使用别的函数取代。
2. 使用shadow 的系统已把用户密码抽出/etc/passwd, 因此使用getpw()取得的密码将为"x"。
#include &pwd.h&
#include &sys/types.h&
char buffer[80];
getpw(0, buffer);
printf("%s\n", buffer);
root:x:0:0:root:/root:/bin/bash
C语言getpwnam()函数:从密码文件中取得指定账号的数据
#include &pwd.h&
#include &sys/types.h&
定义函数:
struct passwd * getpwnam(const char * name);
函数说明:getpwnam()用来逐一搜索参数name 指定的账号名称, 找到时便将该用户的数据以passwd 结构返回。passwd 结构请参考getpwent()。
返回值:返回 passwd 结构数据, 如果返回NULL 则表示已无数据, 或有错误发生.
/*取得root 账号的识别码和根目录 */
#include &pwd.h&
#include &sys/types.h&
struct passwd *
user = getpwnam("root");
printf("name:%s\n", user-&pw_name);
printf("uid:%d\n", user-&pw_uid);
printf("home:%s\n", user-&pw_dir);
home:/root
C语言getpwuid()函数:从密码文件中取得指定uid的数据
#include &pwd.h&
#include &sys/types.h&
定义函数:
struct passwd * getpwuid(uid_t uid);
函数说明:getpwuid()用来逐一搜索参数uid 指定的用户识别码, 找到时便将该用户的数据以结构返回结构请参考将该用户的数据以passwd 结构返回. passwd 结构请参考getpwent()。
返回值:返回 passwd 结构数据, 如果返回NULL 则表示已无数据, 或者有错误发生.
#include &pwd.h&
#include &sys/types.h&
struct passwd *
user= getpwuid(6);
printf("name:%s\n", user-&pw_name);
printf("uid:%d\n", user-&pw_uid);
printf("home:%s\n", user-&pw_dir);
name:shutdown
home:/sbin
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具C语言按关键字搜索文件夹中文件的方法
作者:鉴客
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了C语言按关键字搜索文件夹中文件的方法。分享给大家供大家参考。具体实现方法如下:
#include&iostream&
#include&string&
#include&io.h&
void filesearch(string path,string mode)
struct _finddata_
if(path[path.size()-1]=='\\')
path.resize(path.size()-1);
string curr=path+"\\*.*";
int done=0,
if((handle=_findfirst(curr.c_str(),&filefind))==-1)
while(!(done=_findnext(handle,&filefind)))
if(!strcmp(filefind.name,".."))
curr=path+"\\"+filefind.
if(strstr(filefind.name,mode.c_str()))
cout&&curr&&
if (_A_SUBDIR==filefind.attrib)
filesearch(curr,mode);
_findclose(handle);
void main()
string path,
cout&&"请输入要搜的目录"&&
cout&&"请输出包含字符"&&
filesearch(path,mode);
#include&stdio.h&
#include&string.h&
#include&dir.h&
#define SIZE 12
void find_creat_file(char *);
int main(void)
char filename[SIZE];
strcpy(filename,"filename");
find_creat_file(filename);
void find_creat_file(char *filename)
done=findfirst("d:\\filename",&ffblk,0);
if(done==0)
mkdir("d:\\filename");
希望本文所述对大家的C语言程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具杭电oj第二题的答案?编了很久没通过,本人菜鸟,但热爱c语言,求大家指点
[问题点数:40分]
杭电oj第二题的答案?编了很久没通过,本人菜鸟,但热爱c语言,求大家指点
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。C语言中isdigit()函数和isxdigit()函数的用法
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言中isdigit()函数和isxdigit()函数的用法,用来判断字符师傅为阿拉伯数字和16进制数字,需要的朋友可以参考下
C语言isdigit()函数:判断字符是否为阿拉伯数字
#include &ctype.h&
定义函数:
int isdigit(int c);
函数说明:检查参数 c 是否为阿拉伯数字0 到9。
返回值:若参数c 为阿拉伯数字,则返回true,否则返回null(0)。
附加说明:此为宏定义,非真正函数。
范例:找出str 字符串中为阿拉伯数字的字符。
#include &ctype.h&
char str[] = "123@#FDsP[e?";
for(i = 0; str[i] != 0; i++)
if(isdigit(str[i]))
printf("%c is an digit character\n", str[i]);
执行结果:
1 is an digit character
2 is an digit character
3 is an digit character
C语言isxdigit()函数:判断字符是否为16进制数字
#include &ctype.h&
定义函数:
int isxdigit (int c);
函数说明:检查参数c是否为16 进制数字,只要c为下列其中一个情况就检测成功。
16进制数字:ABCDEF。
返回值:若参数c 为16 进制数字,则返回非 0,否则返回 0。
附加说明:此为宏定义,非真正函数。
范例:找出字符串str 中为十六进制数字的字符。
#include &ctype.h&
char str[] = "123c@#FDsP[e?";
for(i = 0; str[i] != 0; i++)
if(isxdigit(str[i]))
printf("%c is a hexadecimal digits\n", str[i]);
执行结果:
1 is a hexadecimal digits
2 is a hexadecimal digits
3 is a hexadecimal digits
c is a hexadecimal digits
F is a hexadecimal digits
D is a hexadecimal digits
e is a hexadecimal digits
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 c语言从菜鸟变高手 的文章

 

随机推荐