《实用C语言编程》章节试读

出版社:中国电力出版社
出版日期:2000-05
ISBN:9787508303086
作者:Steve Oualline
页数:480页

《实用C语言编程》的笔记-第25页

gcc -g -Wall -ansi -pendantic -o hello hello.c
-ansi 关掉和 ANSI C 不相匹配的 GNU C 特性
-pedantic 开关可以使编译器对遇到的任何非 ANSI 特征发出警告

《实用C语言编程》的笔记-第249页 - 文件输入/输出

测试代码如下:
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
int count =0,count2=0;
FILE *in_file,*out_file;
int ch;
char msg[40],*msg2;

in_file = fopen("/Users/sparkmorry/学习工作/C语言学习/C14/C14/input.txt","r");
out_file = fopen("/Users/sparkmorry/学习工作/C语言学习/C14/input.txt","w");
if(in_file==NULL){
fprintf(stderr,"cannot open\n");
exit(8);
}

while(1){
ch=fgetc(in_file); //读取单个字符
//fputc(ch,out_file);
if(ch==EOF)
break;
++count;
}

fseek(in_file, 0, SEEK_SET); //把文件指针指向文件开头,必须
while(fgets(msg, sizeof(msg), in_file)) //从文件读取一个字符串,按sizeof的大小每读一次
{
puts (msg); //输出字符串
msg2=strcat(msg,"?"); //拼接字符串,msg[]数组不可赋值,*msg2指针可以赋值为一个数组的地址
fputs(msg2, out_file); //写字符串到文件
++count2;
}
fclose(out_file);

printf("count2=%d\n",count2);//输出用的字符串个数,以回车为停

fclose(in_file);

return 0;
}
这里有几个函数:
1. fopen,fclose很好理解,带操作一个文档之前先打开。
2. fgetc,fputc,是从文件中读取单个字符或者输出单个字符到文件中,以EOF为文件的结尾;
3. fseek(in_file, 0, SEEK_SET); 将文件指针指向文件/流的某个位置,如这里是0,即开头。
4. fgets,fputs,是从文件里读取字符串(以第二个参数为大小每次读一次),和写字符串到文件里。
5.fprintf,fscanf,读写对象不是终端而是磁盘文件,将字符或者字符串写到一个文件中或从一个文件中读出来。
6.sprintf,sscanf是格式化输出到一个字符串

《实用C语言编程》的笔记-第69页

#include <stdio.h>
int term; /* term used in two expressions */
int main()
{
term = 3 * 5;
/* 故意让 %d 的数目和表达式的数目不一致 */
printf("Twice %d is %d\n", term, 2*term, 3*term);
printf("Three times %d is %d\n %d", term, 3*term);
return (0);
}
看看运行结果:
$ gcc -g -Wall -o twice twice.c
twice.c: 在函数‘main’中:
twice.c:20:5: 警告: 提供给格式字符串的实参太多 [-Wformat-extra-args]
twice.c:21:5: 警告: 格式 ‘%d’ expects a matching ‘int’ argument [-Wformat]

《实用C语言编程》的笔记-第104页

strcmp(string1,string2);
两个字符串相等时返回 0 。
if ( 0 == strcmp(string1,string2) ) {
printf("Strings equal.\n");
} else {
printf("Strings not equal.\n");
}

《实用C语言编程》的笔记-第93页

以 0 开头表示八进制常量。如 0123 (十进制 83)
以 0x 开头表示十六进制常量。如 0x15 (十进制 21)

《实用C语言编程》的笔记-第222页 - 简单指针

整型变量int:
int *num_ptr; //此处的*与下方*作用不同,仅表示声明num_ptr为指针类型
int num;
num = 9;
num_ptr = &num; //&运算num变量的地址
*num_ptr = num; //*运算num_ptr指向的对象(变量)
num2 = *num_ptr; //将num2赋值为*num_ptr指针指向的变量
printf("num=%d, *num_ptr =%d,num_ptr=%d,&num=%d\n",num, *num_ptr, num_ptr,&num);
//num=9, *num_ptr =9,num_ptr=1606416564,&num=1606416564
printf("num2=%d",num2);
另有一种不合法的表达,但是编译通过:
int *Num = 20;在初始化时 int *Num; *是声明Num变量为指针,而不是运算*Num对象,所以在这里赋值其实是不合理的
字符变量char:
字符变量中比较纠结的是字符指针和字符数组,均可用于表达字符串变量。
字符指针char*为一个指向字符变量的指针,而字符数组为开辟的为一串字符存储的空间。而char*可以表示字符数组char string[]的首元素的地址:
char* first = &string[0]; => first = string;
这两者表达方式相同,因为C语言不明确区别数组和地址。
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
char* string1;
char string2[]= "I love C2"; //不能用赋值语句将一个字符串常量直接给一个字符数组赋值。不能在非初始化时用string2="I love C";或者string2[]="";因为数组不能给数组赋值
char X = "W"; //用“”赋值字符,或者用''赋值字符指针都会引起混乱
char *string3 ='PT';


const char* string4 ="WTF"; //字符指针指向的对象不可变
char *const string5 ="WTF"; //字符指针不可变

string1 = "I love C"; //字符串常量相当对一个字符数组,赋值给字符指针时类似于将首元素地址赋值给string1
string1=string2; //或者将数组赋值给字符指针

printf("string1=%s\n",string1); //将字符指针按%s打印时,默认以循环的方式输出%c直到'\0'字符

strcpy(string2,"I love X"); //若要给字符数组赋值应采取的方式

printf("X=%c,string3=%c\n",X,string3); //@ T
string3='i'; //*string3='i'不可赋值,理论上可编译,但不知为什么编译不成功

string4=string2;
//*string4 = string2; *string4="xxxx"不可行,因为*string4是常量不可修改
printf("string4=%s\n",string4);

*string5='C'; //理论上可行,但不知为什么编译不成功(2)
//string5=string2; 不可行,因为string5不能被更改
printf("string5=%c\n",&string5);

return 0;
}
这里有一个细节:
int *Num = 20;
char* string4 ="WTF";
这两个看起来原理差不多,但是后一个把字符赋值给指针,就是把字符的ACSII传递给指针。而上一个将整型指针赋值20是没有意义的,但编译器按赋值对象操作。
(2)找到答案:字符数组和字符指针又有什么区别呢?
首先在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中。
其次字符数组保存的字符串属于字符串变量,可以被修改,而字符指针指向的字符串是属于字符串常量,不能被修改。
所以*string5是不能被修改的。

《实用C语言编程》的笔记-第172页

#undef DEBUG
会导致不论使用或没有使用 -DDEBUG 都不会定义 DEBUG 。

《实用C语言编程》的笔记-第45页

man -k keyword
如: man -k output

《实用C语言编程》的笔记-第160页

递归函数
必须有结束点
必须使问题变得简单

《实用C语言编程》的笔记-第57页

一向都是 4 空格缩进

《实用C语言编程》的笔记-第97页

#include <stdio.h>
int main()
{
int i = 1;
int j;
j = (i++ * 5) + (i++ * 3);
printf("i = %d\n", i);
printf("j = %d\n", j);
return (0);
}
在我的机子上结果是:
i = 3
j = 8

《实用C语言编程》的笔记-第174页

Look at the following code:
#ifndef _CONST_H_INCLUDED_
/* define constants */
#define _CONST_H_INCLUDED_
#endif
/* _CONST_H_INCLUDED_ */
When const.h is included, it defines the symbol _CONST_H_INCLUDED_ . If that symbol is already defined (because the file was included earlier), the #ifndef conditional hides all defines so they don't cause trouble.


 实用C语言编程下载 更多精彩书评


 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024