C语言笔记本

16 6 月, 2010 by edsionte 5 comments »

在此记录一些常见的C语言错误,可以当作学习C语言的笔记,需要的时候可以回过头看看。

1.关于“++”

#include
int main()
{
	int a,b,cd;
	a=10;
	b=a++;
	c=++a;
	d=10*a++;
        printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
	return 0;
}

关于自加自减运算符用于句话就可以总结:a++先使用后自加,++a先自加再引用。这样就可以轻松得出结果:

edsionte@edsionte-laptop:~/code$ ./test
a=13 b=10 c=12 d=120

2.交换变量
第一种方法即中间变量法,下面说明第二种,不添加中间变量:

int a=1,b=2;
a=a+b;
b=a-b;
a=a-b;

3.char* str=”hello world”; sizeof(str)=12,strlen(str)=11.因为strlen函数求字符串长度时不包含字符串末尾的’\0’。

4.char a[10];int len=strlen(a); len其实不等于10,应该注意strlen求的是从字符串第一个元素到‘\0’之间字符总数(不包含‘\0’),而此数组未初始化。尽管语法上是正确的,但是用法错误。如果换作sizeof(a),结果便是10。

5.int(*s[10])(int) 表示什么?

这个语句看起来很复杂,不过我们一步步来分析。首先s[10]是一个数组,*s[10]说明他的元素是指针。那种类型的指针呢?整体来看这个语句:int(*)(int),不用多说是函数指针。那么进一步说就是,s[10]是一个有10个元素的指针数组,每个元素都指向一个函数,并且这个函数有一个int参数,并且返回int型的值。这样看好像很麻烦,不久是一个指针数组吗,何必这么麻烦。为了好理解,我们可以这么看:int(*)(int)  s[10]。

类似的对于数组指针,我们也可以这么理解,以便加深记忆。比如int (*s)[10];s是一个指向数组的指针,这样定义一个指针说实话很难让人理解。那么我们不要被他这个样子而迷惑,那就这么理解吧:int (*)[10] s;这样很符合一般指针定义的规则。

6.如下语句:

char* dest=”hello,world”;

char* src=”hello”;

puts(strcpy(dest,src));

这样做是错误的,原始是因为dest指向字符串常量,不可修改其某个字符值。其实正确的写法应该是const char* dest=”hello,world”;但是一般情况下不加const编译的时候也不会出错。但是如果dest[2]=’a’;那么就会出错,即便这条语句合乎语法。如果 char a[100]; char* dest=a;因为数组中的元素是变量,可以修改,也就可成功打印。如果有下面语句:char str[100]=”hello,world”,这样写完全正确,因为只是用hello world初始化这个数组而已。

7.想要输入下面一段字符串:edsionte is a goog boy。用scanf函数是不行的。因为scanf函数以回车键和空格键作为字符串输入结束的标志。而gets函数则仅以回车键作为字符串输入的结束符。因此可以使用gets函数来接收含有空格键的字符串。

8.宏定义和预编译不属于c语言语句,因此不已;结尾。而结构体定义属于c语言语句,应该以分号结尾。

9.共用体内可以定义多个不同类型的成员变量 ,但是每次只能使用一个变量。即这些变量共同使用一段内存空间,这段内存空间的大小由这些变量中长度最长的变量决定。

10.对于int a[5]这个数组来说,a,&a,&a[0],a+1,&a+1,&a[0]+1各代表什么?

a:a是这个数组的名称,它代表数组首元素的首地址,也就是a[0]的首地址。

&a:是数组的首地址。注意如果打印a和&a的值,两者是一样的,但是意义不同。

&a[0]:a[0]的首地址,等价于a。

a+1:数组中下一个元素的地址,即a[1]的地址。

&a+1:这是一个指向下一个数组的指针,这个数组是一个长度为5的整型数组。

&a[0]+1:等价于a+1。

11.在一般的32位机当中,指针类型均为4个字节,即便这个指针指向一个字符,因为指针说到底还是地址。对于一个数组int a[10],那么sizeof(a)=10*4;但是如果p是一个指向此数组的指针,那么sizeof(p)就是4。

12.给一个指针加上一个整数与给该指针的二进制表示加上同样的整数含义是不同的。比如int a[10];int *p=a;那么p+1指向的是这个数组的第二个元素,并不是在a[0]元素的首地址上加1。

13.定义一个枚举类型的变量:

enum return_value
{
	RET_TURE;
	RET_FALSE;
	RET_RANDOM;
}

枚举类型中每一个枚举常量都是用标示符表示的整形常量。上述枚举类型中的各个枚举常量并未赋值,但是默认值依次为0,1,2。

create()和open()

9 6 月, 2010 by edsionte 无评论 »

creat()和open()都可以创建文件,但是稍有区别。如果按照如下方式设置参数则两者是等价的:

open(const char* pathname, (O_CREAT|O_WRONLY|O_TRUNC),mode_t mode);
creat(const char* pathname,mode_t mode);

若要创建的文件不存在,则按照mode方式创建新文件。当要创建的文件已经存在到时候,覆盖原有文件。事实上是因为O_WRONLY|O_TRUNC参数的原因:当文件存在并且以可写方式打开的时候,原有文件到长度则清0,即会清空原有文件,但是文件属性不变,与原有文件方式相同,并不会设置成mode方式。

在下面的源代码中,以open函数方式创建文件时,由于设置拉O_CREAT|O_EXCL参数,当要创建到文件不存在时,open函数创建这个文件,并且文件到存取权限为S_IRUSR|S_IWUSR。当文件存在时因为设置拉O_EXCL则出现错误。而当以creat()方式创建文件时,如本文开头所述,无论是否存在将要创建的那个文件,都不会出现错误。

下面作测试。

首先注意,在下面的源代码中open()函数中的文件权限s设置为:S_IRUSR|S_IWUSR(文件所有着可读可写)。creat()设置的文件权限为:S_IRWXU(文件所有者可读可写可执行)。

第一次运行本程序,选择使用open()创建example_62.c。

please select a way of creating files:
1.creat 2.open
2
create file success
edsionte@edsionte-laptop:~/code$ ls -l
总用量 48
-rw------- 1 edsionte edsionte    0 2010-06-16 12:38 example_62.c

第二次运行本程序,以creat()创建文件,依然会运行成功,但是此时的example_62.c的存取权限是否是creat()中设置的S_IRWXU呢?

edsionte@edsionte-laptop:~/code$ ./my_create
please select a way of creating files:
1.creat 2.open
1
create file success
edsionte@edsionte-laptop:~/code$ ls -l
总用量 48
-rw------- 1 edsionte edsionte    0 2010-06-16 12:40 example_62.c

正如上面所述的,creat()创建已存在的文件,并不会更改原文件的属性。

源代码如下:

#include "stdio.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"
#include "error.h"

int main()
{
	int fd,n;
	printf("please select a way of creating files:\n");
	printf("1.creat 2.open\n");
	scanf("%d",&n);
	if(n==1)
	{
		if((fd=creat("example_62.c",S_IRWXU))==-1)
		{
			perror("open");
			exit(1);
		}
		else
		{
			printf("create file success\n");
		}
	}
	else if(n==2)
	{
		if((fd=open("example_62.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1)
		{
			perror("open");
			exit(1);
		}
		else
		{
			printf("create file success\n");
		}
	}
	else
	{
		printf("your choice may be wrong\n");
	}
	close(fd);
	return 0;
}

create()和open()是文件操作中最基本的函数,大家应该在实践中不断总结。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key