c程式語言 - dywang.csie.cyut.edu.twdywang.csie.cyut.edu.tw/dywang/download/pdf/clanguage.pdf ·...
TRANSCRIPT
C程式語言
Department of Computer Science and Information EngineeringChaoyang University of TechnologyTaichung, Taiwan, Republic of China
Instructor: De-Yu Wang ( )E-mail: [email protected]
Homepage: http://dywang.csie.cyut.edu.twPhone: (04)23323000 ext 4538
Office: E738
p q r s t u v w x y z { | } ~ ~January 2, 2020
• Instructor: De-Yu Wang
1. Email: [email protected]
2. Homepage: http://dywang.csie.cyut.edu.tw
3. pdf
4. Phone: (04)23323000 ext 4538
5. Office: E738
•
1. C 語言 /
2. Linux
3. C Programming Tutorial
4. Debugging with GDB
5. Linux Strip Command Examples (Reduce Executable/Binary File Size)
De-Yu Wang CSIE CYUT i
Contents
1 61.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3 NAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 C語言 142.1 C 語言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2 程式語言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.3 程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 vi 183.1 vi vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.2 vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3 vim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.4 vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 gcc 244.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.3 gcc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5 305.1 程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305.2 語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325.4 程式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1
CONTENTS CONTENTS
6 366.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366.2 sizeof . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386.5 char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
7 437.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8 式 478.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478.2 printf 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478.3 printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488.4 scanf 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.5 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498.6 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518.7 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528.8 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538.9 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548.10 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . 558.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9 589.1 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629.6 Bitwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
10 6810.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6810.2 if statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6810.3 if...else statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7010.4 nested if statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7110.5 if...else if...else Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 7310.6 ?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7410.7 switch statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7610.8 goto statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
De-Yu Wang CSIE CYUT 2
CONTENTS CONTENTS
10.9 nested switch statements . . . . . . . . . . . . . . . . . . . . . . . . . . 7910.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
11 8111.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8111.2 for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8111.3 while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8311.4 do...while loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8411.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8511.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8611.7 break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8811.8 continus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8911.9 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8911.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
12 main 式 9312.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9312.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9312.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9412.4 errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9512.5 STDOUT STDERR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9712.6 式 perror . . . . . . . . . . . . . . . . . . . . . . . . . . . 9912.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
13 式 10313.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10313.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10313.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10413.4 call by value . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10513.5 call by reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10613.6 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10713.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10813.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11013.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
14 11314.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11314.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11414.3 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11614.4 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11714.5 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11814.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
15 12215.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12215.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12315.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12415.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12515.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
De-Yu Wang CSIE CYUT 3
CONTENTS CONTENTS
15.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12715.7 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12815.8 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12915.9 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13015.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
16 13416.1 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13416.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13416.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13516.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
17 13717.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13717.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13717.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13817.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13917.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14017.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14117.7 fseek 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14217.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
18 14518.1 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14518.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14518.3 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14718.4 式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14818.5 Bit Fileds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15018.6 Union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15118.7 Union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15218.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
19 C 15619.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15619.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15719.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15719.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15919.5 .h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16019.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
20 gdb 16420.1 gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16420.2 gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16420.3 Python gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16620.4 gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16720.5 gdb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
De-Yu Wang CSIE CYUT 4
CONTENTS CONTENTS
21 Strip程式 17221.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17221.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17321.3 strip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
22 QtEmbedded porting 18622.1 arm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18622.2 Qt embedded . . . . . . . . . . . . . . . . . . . . . . . . . . . 18822.3 Qt embedded 程式 . . . . . . . . . . . . . . . . . . . . . . . 19022.4 target board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
De-Yu Wang CSIE CYUT 5
Chapter 1
1.1
1.
2. Linux式
3.
4.
5.
6. LDAP YUM repositoryNFS NTP ISCSI DNS
FTP
1.2
1. Linux
(a) Linux
(b) Linux
(c)
2. Linux
(a) E517
6
1.3. NAT CHAPTER 1.
(b)
(c) LiveCD LiveCD
1.3 NAT
1. NAT
2. Linux Windows Honda式
3.
4. 式
(a)
(b)
(c)
(d)
(e)
(f)
5.
1.4
1. GUI 程式 程式
(a) Rebuild KVM KVM 10
De-Yu Wang CSIE CYUT 7
1.4. CHAPTER 1.
(b) Revert KVM KVM程
(c) Reboot KVM KVM
(d) KVM Console KVM
2. KVM KVM111111 kvm8 Revert KVM
3. virt-view�1 [dywang@dywH ~]$ sudo virt-viewer kvmusb
No protocol specified3 Cannot open display:
Run 'virt-viewer --help' to see a full list of available command lineoptions� �
4. Xwindow $XAUTHORITY�[dywang@dywH ~]$ echo $XAUTHORITY� �
5. XAUTHORITY XAUTHORITY=~/.Xauthoritysudo
De-Yu Wang CSIE CYUT 8
1.5. CHAPTER 1.
�[dywang@dywH ~]$ XAUTHORITY=~/.Xauthority sudo virt-viewer kvmusb� �
1.5
1. 程式
�1 [root@dywH ~]# e517sshpass.sh
myip=1043 hosts=103,105
q(quit) iscsi halt reboot c(clear) l(lvm) rhcsa rhce5 > t(mounttest) k(kvmreboot) v(kvmrevert) s(servicerestart)
> vi1 c1 lpvar c999 sh999 hp(hostpatch)? c9997 keyin remote host root password:� �
2.
(a) q(quit)
(b) iscsi ISCSI
(c) halt
(d) reboot
(e) c(clear)
(f) l(lvm) 式
(g) rhcsa RHCSA
(h) rhce RHCE
(i) t(mounttest)
(j) k(kvmreboot) KVM
(k) v(kvmrevert) KVM
(l) s(servicerestart)
(m) vi1 vi
(n) c1 C 語言 程式
(o) lpvar shell
(p) c999 C 語言程式
(q) sh999 Shell script 程式
(r) hp(hostpatch)
De-Yu Wang CSIE CYUT 9
1.6. CHAPTER 1.
1.6
1. E517 ?-? 1-1
2. ( )IP 192.168.1.140 IP 140�
1 [dywang@deyu ~]$ ifconfig | grep 192inet addr:192.168.1.140 Bcast:192.168.1.255 Mask
:255.255.255.03 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask
:255.255.255.0� �3. deyu.wang dywang sid
式 IP1-11 IP 199 123456�
1 [dywang@deyu ~]$ echo '1-11 199 123456 ' > sid[dywang@deyu ~]$ cat sid
3 1-11 199 123456� �
1.7
1. ( )[dywang@deyu ~]$ ifconfig
IP
(a) Server deyu.wang server.deyu.wang
(b) Server deyu.wang 192.168.122.0/24
(c) Server IP 192.168.122.1 IP 192.168.122.X X
2.
(a) kvmX.deyu.wang IP 192.168.122.X X5 7
(b) root 123qwe
(c) RHCE my111.wang 192.168.111.0/24server IP 192.168.111.1
(d) �1 IP Address: 192.168.122.X
Netmask: 255.255.255.03 Gateway: 192.168.122.1
De-Yu Wang CSIE CYUT 10
1.8. CHAPTER 1.
Name server: 192.168.122.1� �(e) RHCSA/RHCE 6,7 repositority http://dywang.csie.cyut.edu.tw/
centos7.
(f) RHCSA 8 repositority
i. BaseOS repo server: http://dywang.csie.cyut.edu.tw/centos8/BaseOS.ii. AppStream repo server: http://dywang.csie.cyut.edu.tw/centos8/App-
Stream.
(g) kernel packages: RPM http://dywang.csie.cyut.edu.tw/ker-nel/centos7.
(h) LDAP server
i. deyu.wangii. base DN dc=deyu,dc=wangiii. ftp://deyu.wang/pub/cacert.pem.
1.8
1. ()
2. server
1.8.1 DNS server
(a) DNS sshserver host IP
(b) DNS server�[dywang@deyu ~]$ host kvm7.deyu.wang
2 ;; connection timed out; trying next origin;; connection timed out; no servers could be reached� �
(c) DNS server kvm7.deyu.wang IP�1 [dywang@deyu ~]$ host kvm7.deyu.wang
Host kvm7.deyu.wang not found: 3(NXDOMAIN)� �(d) deyu.wang root
De-Yu Wang CSIE CYUT 11
1.8. CHAPTER 1.
�[dywang@deyu ~]$ su -
2 Password: 123123[root@deyu ~]#� �
(e) setdnsmasq.sh dnsmasq DNS�1 [root@deyu ~]# setdnsmasq.sh restart� �
(f) host kvm7.deyu.wang IP 192.168.122.7�1 [root@deyu ~]# host kvm7.deyu.wang
kvm7.deyu.wang has address 192.168.122.73 kvm7.deyu.wang mail is handled by 1 20.� �
(g) setdnsmasq.sh dnsmasq DNSsetdns.sh named DNS�
1 [root@deyu ~]# setdns.sh restart� �
1.8.2 LDAP server
(a) LDAP ldapuser1deyu.wang ( ) root�
1 [dywang@deyu ~]$ su -Password: 123123
3 [root@deyu ~]#� �(b) setldap1.sh restart LDAP
�1 [root@deyu ~]# setldap1.sh restart� �
1.8.3 NFS server
(a) server server NFSLDAP NFS
server deyu.wang root
De-Yu Wang CSIE CYUT 12
1.8. CHAPTER 1.
�1 [dywang@deyu ~]$ su -
Password: 1231233 [root@deyu ~]#� �
(b) setnfs.sh�1 [root@deyu ~]# setnfs.sh restart� �
De-Yu Wang CSIE CYUT 13
Chapter 2
C語言
2.1 C語言
1. C語言 Dennis Ritchie (1941-2011) 70
2. 1967 Ritchie
3. C 語言 C++ 語言 Unix
4. (Ken Thompson) DEC PDP-7語言
5. 語言 B 語言
6. 1971 B 語言 C 語言 B 語言
7. 1964Multics (MULTiplexed Information and
Computing System)
8. 1969 MULTICS
9. 1973 DEC PDP-7 multicsUnix
10. Unix C 語言 程式 Linux
11. C 語言 Unix
14
2.2. 程式語言 CHAPTER 2. C 語言
12. Ritchie Thompson C 語言 程式 語言
13. C 語言 Yahoo Google C 語言程式 程式語言
14. C語言 Linux BSD Mac OS
2.2 程式語言
2.2.11.
(a) 程式
(b) 程式 程式
(c) 程式 basic, shell script, perl, python ...
2.
(a) 程式
(b) 程式 程式 語
(c) 程式 c, c++, pascal, cobol, fortran, java ...
De-Yu Wang CSIE CYUT 15
2.3. 程式 CHAPTER 2. C 語言
2.2.21. 語言
(a)
(b)
(c)
(d) 語言 語言
2. 語言
(a) 語言 語
(b)
(c)
(d) basic, shell script, python, pascal, cobol 語言
3. c 語言 語言 語言 python, java, perl 程式語言c 式 c 語言
2.3 程式
1. 程式 程式
(a) 程..Start/End.
Decision
.
Process
.
Intput/Output
(b) 程
De-Yu Wang CSIE CYUT 16
2.3. 程式 CHAPTER 2. C 語言
..Start.
file?
.
ReadParameters
.
Date
.
Legal?
.
Waring
.
getWeek
.
makePaper
.
makePaper
.
wknu > 18 ?
.
Stop
.
yes
.
No
.
all or All
.
yes
.
yes
.
other
.
no
2. 程式
(a) 程
(b)
3.
4. 程式
5.
6. 程式
De-Yu Wang CSIE CYUT 17
Chapter 3
vi
3.1 vi vim
1. Linux Linux
2. Linux Unix ASCII
3. vi vim vi
4. vim
5. vim vim 程式
6. VIM
3.2 vi
1. vi 式 式 式 式
式-
�
-
�
:, /, ?
[Esc]
i,o,a,rI,O,A,R
式
式
2.
(a) vi 式
�1 [dywang@dywOffice tmp]$ vim test.txt� �
(b) i 式
18
3.2. VI CHAPTER 3. VI
(c) [Esc] 式
(d) 式 :wq vi
3.
式hjkl[Ctrl]+f[Ctrl]+b[Ctrl]+d[Ctrl]+u+-n<space> n
20<space> 20
0 0$HMLGnG n 20G
20 ( :set nu)n<Enter> n
式/word word?word wordnN:n1,n2s/word1/word2/g n1 n2 word1
word2:1,$s/word1/word2/g word1
word2:1,$s/word1/word2/gc word1
word2
式x, X x Xnx nddndd n 20dd 20d1GdGdw (delete word)yynyy n 20yy 20y1G
De-Yu Wang CSIE CYUT 19
3.3. VIM CHAPTER 3. VI
yGp, P p P
Ju[Ctrl]+r.
式i, I i(I) (
)a, A a(A) ( )
o, O o(O) ( )
r, R r RESC
Esc 式 式式
:w:w!:q vi:q! !
:wq :wq!:x wq:e!ZZ
:w [filename]:r [filename]
filename:set nu:set nonu set nu:n1,n2 w [filename] n1 n2 filename:! command vi 式 command
[ :! ls /home ]
4. vi
(a) / home/ csie/ vitest.txt / home/csie/.vitest.txt.swp
(b) vi
(c) vi 程式
3.3 vim
1. vi vi vim
De-Yu Wang CSIE CYUT 20
3.3. VIM CHAPTER 3. VI
�1 [dywang@dywOffice tmp]$ ll /bin/vi*
lrwxrwxrwx 1 root root 20 Oct 17 13:11 /bin/vi -> /etc/alternatives/vi*3 lrwxrwxrwx 1 root root 21 Oct 17 13:11 /bin/vim -> /etc/alternatives/
vim*[dywang@dywOffice tmp]$ ll /etc/alternatives/vi*
5 lrwxrwxrwx 1 root root 21 Oct 17 13:11 /etc/alternatives/vi ->/usr/bin/vim-enhanced*
7 lrwxrwxrwx 1 root root 21 Oct 17 13:11 /etc/alternatives/vim ->/usr/bin/vim-enhanced*� �
2. vim 程式語
3. vim /etc/man.config
�"/etc/man.config" [readonly] 150L, 4900C 1,1
Top� �(a) /etc/man.config
(b)
(c) 150 4900
(d) ,
(e)
4.
vV[Ctrl]+v 式yd
5.
(a) vi :r filename filename
(b) vim vim filename1 file-name2 filename3
:n:N:files
6.
(a) 式 :sp filename
De-Yu Wang CSIE CYUT 21
3.4. VI CHAPTER 3. VI
(b) filename
:sp:sp filename filename[Ctrl]+wj [Ctrl]
wj
[Ctrl]+wk[Ctrl]+wq [Ctrl]+w
:q
7. vim
(a) ~/.viminfo
(b) vim /etc/vimrc
(c) vim ~/.vimrcvim
:set nu:set nonu:set hlsearch:set autoindent:set noautoindent:set backup filename~:set rule:set showmode --insert--:set backspace=(012) 2 backspace
0 1:set all:syntax (off|on) 程式 語
3.4 vi
3.4.11. zzz
2. zzz
3. viex1.txt vi1.txt
4. vi vim vi1.txt
(a) 10
(b) 3
(c) 20
(d) 式 " " 式
De-Yu Wang CSIE CYUT 22
3.4. VI CHAPTER 3. VI
(e) 'ABCDEabcde'
(f) '1234567890'
(g) "MANPATH" "manpath"
(h)
3.4.21. zzz
2. zzz
3. viex2.txt vi2.txt
4. vi vim vi2.txt
(a) 5
(b) 3
(c) 30
(d) 式 " " 式
(e) 'ABCDEabcde'
(f) '1234567890'
(g) 30 "MANPATH" "manpath"
(h)
3.4.31. zzz
2. zzz
3. viex3.txt vi3.txt
4. vi vim vi3.txt
(a) 35
(b)
(c) 20
(d)
(e) 13 'ABCDEabcde'
(f) '1234567890'
(g) 30 55 "man" "MAN"
(h)
De-Yu Wang CSIE CYUT 23
Chapter 4
gcc
4.1
1. Linux (binary file) /usr/bin/passwd, /bin/touch, /bin/bash file /bin/bash
(ELF 64-bit LSB executable) 式 (uses sharedlibs) (ELF: Extensible Linking Format, LSB: Linux Standard Base)�1 [dywang@dywIssd zzz]$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),3 dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped� �
2. Shell scripts shell ( bash) 程式 式binary file /etc/init.d/autofs
shell script�1 [dywang@dywIssd zzz]$ file /etc/init.d/autofs
/etc/init.d/autofs: Bourne-Again shell script text executable� �3. (text file) binary
file gcc C 語 程式binary file
4. C/C++ 程式, C/C++ ( gcc/g++) (sourcecode) 程式
4.2
1. C/C++ (source code)
2. gcc/g++ C/C++ (object file)語言
24
4.3. GCC CHAPTER 4. GCC
3. 式 程式 式 C/C++function 程式
4.
5. gcc/g++ 程 程 *.o 式(Object file)
� +
程式
gcc/g++
(Object file)
式
?
?
?
?
?
6. 程式 程式 程 式程式 式 ( Link ) 程式
式 程
程式
程式 程 式�-
?
?
4.3 gcc
1. vi 程式 hello.c�[dywang@dyw219 zzz]$ vi hello.c
2 #include <stdio.h>
De-Yu Wang CSIE CYUT 25
4.3. GCC CHAPTER 4. GCC
main()4 {
printf("Hello!\n");6 }� �
2. �[dywang@dyw219 zzz]# gcc -c hello.c� �
3. hello.o binary�1 [dywang@dyw219 zzz]$ ll hello.*
-rw-rw-r--. 1 dywang dywang 58 Apr 26 15:20 hello.c3 -rw-rw-r--. 1 dywang dywang 1488 Apr 26 15:20 hello.o� �
4.hello.o�1 [dywang@dyw219 zzz]# gcc -O hello.c -c� �
5. -o binary file�1 [dywang@dyw219 zzz]# gcc -o hello hello.c
[dywang@dyw219 zzz]$ ll hello*3 -rwxrwxr-x. 1 dywang dywang 6663 Apr 26 15:22 hello
-rw-rw-r--. 1 dywang dywang 58 Apr 26 15:20 hello.c5 -rw-rw-r--. 1 dywang dywang 1488 Apr 26 15:20 hello.o� �
6. -Wall 程式-Wall -O (FLAGS) CCFLAGS�
1 [dywang@dyw219 zzz]# gcc -o hello hello.c -Wallhello.c:2:1: warning: return type defaults to int [-Wreturn-type]
3 main()^
5 hello.c: In function main:hello.c:5:1: warning: control reaches end of non-void function [-Wreturn
-type]7 }
^� �
De-Yu Wang CSIE CYUT 26
4.4. CHAPTER 4. GCC
7. binary file 式
(a) -lm 式 libm.so libm.a
(b) -L 式
(c) -I include
�[dywang@dyw219 zzz]$ gcc -o hello1 hello.c -lm -L/usr/lib -I/usr/include� �
8. hello1 hello libm.so.6 式�1 [dywang@dyw219 zzz]$ ldd hello
linux-vdso.so.1 => (0x00007fff308dd000)3 libc.so.6 => /lib64/libc.so.6 (0x000000394aa00000)
/lib64/ld-linux-x86-64.so.2 (0x0000560fe1b54000)5 [dywang@dyw219 zzz]$ ldd hello1
linux-vdso.so.1 => (0x00007ffce89bb000)7 libm.so.6 => /lib64/libm.so.6 (0x000000394ae00000)
libc.so.6 => /lib64/libc.so.6 (0x000000394aa00000)9 /lib64/ld-linux-x86-64.so.2 (0x000055a2b0e7f000)� �
4.4
1. a.h b.h c.h C main.c 2.c 3.c
(a) �1 [dywang@dyw219 zzz]$ wget http://dywang.csie.cyut.edu.tw/dywang/
download/make1.tar.gz� �(b) make1.tar.gz�
1 [dywang@dyw219 zzz]$ tar zxvf make1.tar.gzmake1/
3 make1/main.cmake1/b.h
5 make1/c.hmake1/2.c
7 make1/3.cmake1/a.h� �
2. 程式
(a) make1
De-Yu Wang CSIE CYUT 27
4.5. CHAPTER 4. GCC
�[dywang@dyw219 zzz]$ cd make1
2 [dywang@dyw219 make1]$� �(b) .c .o�
[dywang@dyw219 make1]$ gcc -c main.c2 [dywang@dyw219 make1]$ gcc -c 2.c
[dywang@dyw219 make1]$ gcc -c 3.c� �(c) .o�
1 [dywang@dyw219 make1]$ gcc -o main main.o 2.o 3.o� �(d) 程式 main�
1 [dywang@dyw219 make1]$ ./main2222[dywang@dyw219 make1]$� �
4.5
1. main.c 2.c 3.c 程式 include 程式 c.hmain.c 2.c 3.c b.h 程式
2.c 程式�[dywang@dyw219 make1]$ grep ^# main.c
2 #include <stdlib.h>#include "a.h"
4 [dywang@dyw219 make1]$ grep ^# 2.c#include <stdio.h>
6 #include "a.h"#include "b.h"
8 [dywang@dyw219 make1]$ grep ^# 3.c#include "b.h"
10 #include "c.h"� �2. 2.c 2222�
[dywang@dyw219 make1]$ vim 2.c2 [dywang@dyw219 make1]$ grep 2222 2.c
printf("2222\n");� �De-Yu Wang CSIE CYUT 28
4.6. CHAPTER 4. GCC
3. main 2.o main�1 [dywang@dyw219 make1]$ gcc -c 2.c
[dywang@dyw219 make1]$ gcc -o main main.o 2.o 3.o� �4. main 2222�
[dywang@dyw219 make1]$ ./main2 2222� �
4.6
1.
(a) zzz
(b) zzz
2. C 語言程式 gcc1.c
(a) IP
(b) gcc1.c gcc1.o
(c) gcc1.b1
(d) 式 libm.so gcc1.b2
3. make1.tar.gz
(a) make1.tar.gz
(b) make1
(c) 程式 程式 IP
(d) .c .o
(e) .o main.b1
De-Yu Wang CSIE CYUT 29
Chapter 5
5.1 程式
1. 程式
(a) (Preprocessor Commands)
(b) 式 (Functions)
(c) (Variables)
(d) 式 (Statements & Expressions)
式
(e) (Comments)
2. C 語言程式�#include <stdio.h>
2int main()
4 {/* my first program in C */
6 printf("Hello, World! \n");
8 return 0;}� �
3. C stdio.h <....h>
�1 #include <stdio.h>� �
4. 式 main C 程式 式 式{ ...}
30
5.2. 語 CHAPTER 5.
�1 int main()� �
5. �1 printf("Hello, World! \n");
return 0;� �6. �
/* my first program in C */� �
5.2 語
1. C 程式 tokens tokens (keyword) (identifier)(constant) (string literal) (symbol)
2. �1 printf("Hello, World! \n");� �
3. Hello, World 程式 tokens�1 printf
(3 "Hello, World! \n"
)5 ;� �
4. ';'�1 printf("Hello, World! \n");� �
5. 程式
(a) A-Z a-z _(b) A-Z a-z _ 0-9
(c)@, $, %, ^ +, - , &, * ...
De-Yu Wang CSIE CYUT 31
5.3. CHAPTER 5.
(d) C 語言 Linux Var var
6. C 語言�1 auto break case char
const continue default do3 double else enum extern
float for goto if5 int long register return
short signed sizeof static7 struct switch typedef union
unsigned void volatile while� �7. �
int a, b;2 a = b + 3;� �
5.3
1. (debug) 程式
2. 語 程式 語 C 語言 hello.c�[dywang@dyw219 zzz]$ vim hello.c
2 [dywang@dyw219 zzz]$ cat hello.c#include <stdio.h>
4 main() {printf("Hello!\n");
6 )� �3. gcc hello.c 4 ) (�
[dywang@dyw219 zzz]$ gcc hello.c2 hello.c: In function main:
hello.c:4:1: error: expected statement before ) token4 )
^6 hello.c:4:1: error: expected declaration or statement at end of input� �
4.
De-Yu Wang CSIE CYUT 32
5.4. 程式 CHAPTER 5.
�[dywang@dyw219 zzz]$ vim hello.c
2 [dywang@dyw219 zzz]$ cat hello.c#include <stdio.h>
4 main() {printf("Hello!\n");
6 }� �5. �
[dywang@dyw219 zzz]$ gcc hello.c2 [dywang@dyw219 zzz]$� �
6. 語 程式語 debug1.c程式�[dywang@dyw219 zzz]$ vim debug1.c
2 [dywang@dyw219 zzz]$ cat debug1.c#include <stdio.h>
4 main() {int a=1, b=2, c;
6 c = a-b;printf("1 + 2 = %d\n", c);
8 }� �7. gcc debug1.c debug1�
[dywang@dyw219 zzz]$ gcc -o debug1 debug1.c� �8. debug1 1 + 2 = -1 語
程式 程式�1 [dywang@dyw219 zzz]$ ./debug1
1 + 2 = -1� �
5.4 程式
1. 程式 TAB 程式 程式
2. 程式 hello.c hello1.c程式 hello.c printf 式main 程式 程式 程式
De-Yu Wang CSIE CYUT 33
5.5. CHAPTER 5.
�[dywang@dyw219 zzz]$ cat hello.c
2 #include <stdio.h>main() {
4 printf("Hello!\n");}
6[dywang@dyw219 zzz]$ cat hello1.c
8 #include <stdio.h>main() {
10 printf("Hello!\n");}� �
3. 程式 hello.c hello2.c 程式 hello2.c#include <stdio.h> 式 main
程式�1 [dywang@dyw219 zzz]$ cat hello.c
#include <stdio.h>3 main() {
printf("Hello!\n");5 }
[dywang@dyw219 zzz]$ cat hello2.c7 #include <stdio.h>
9 main() {printf("Hello!\n");
11 }� �4. hello2.c printf 式�
1 [dywang@dyw219 zzz]$ vim hello2.c[dywang@dyw219 zzz]$ cat hello2.c
3 #include <stdio.h>
5 main() {/* print Hello! */
7 printf("Hello!\n");}� �
5.5
1.
(a) zzz
(b) zzz
De-Yu Wang CSIE CYUT 34
5.5. CHAPTER 5.
(c) cbase1.tar.gz
(d) cbase1.tar.gz
(e) cbase1
(f)
2. C 語言語
(a) token1 token
(b) identifier1 ( )
(c) 式 identifier2
(d) keyword1 C 語言 ( )
(e) ( ) keyword2 C 語言
(f) 式 debug1.c debug1
(g) 式 debug2.c debug2
(h) 式 debug3.c debug3
De-Yu Wang CSIE CYUT 35
Chapter 6
6.1 言
1. C 語言
2.bytes
char 1 -128 to 127 or 0 to 255unsigned char 1 0 to 255signed char 1 -128 to 127int 2 or 4 -32,768 to 32,767 or -2,147,483,648 to 2,147,483,647unsigned int 2 or 4 0 to 65,535 or 0 to 4,294,967,295short 2 -32,768 to 32,767unsigned short 2 0 to 65,535long 8 -9223372036854775808 to 9223372036854775807unsigned long 8 0 to 18446744073709551615
3.bytes
float 4 1.2E-38 to 3.4E+38double 8 2.3E-308 to 1.7E+308long double 10 3.4E-4932 to 1.1E+4932
6.2 sizeof
1. sizeof 式
2. bytes�[dywang@dyw219 zzz]$ vim sizeof1.c
2 [dywang@dyw219 zzz]$ cat sizeof1.c#include <stdio.h>
4main() {
6 printf("sizeof(char) = %d\n", sizeof(char));printf("sizeof(short) = %d\n", sizeof(short));
8 printf("sizeof(int) = %d\n", sizeof(int));
36
6.3. CHAPTER 6.
printf("sizeof(long) = %d\n", sizeof(long));10 printf("sizeof(float) = %d\n", sizeof(float));
printf("sizeof(double) = %d\n", sizeof(double));12 }� �
3. �[dywang@dyw219 zzz]$ gcc -o sizeof1 sizeof1.c� �
4. �1 [dywang@dyw219 zzz]$ ./sizeof1
sizeof(char) = 13 sizeof(short) = 2
sizeof(int) = 45 sizeof(long) = 8
sizeof(float) = 47 sizeof(double) = 8� �
6.3
1.
(a) char
(b) int
(c) float
(d) double
(e) void
2. �1 int i, j, k;
char c, ch;3 float f, salary;
double d;� �3. �
int a, b;2 a=10;
b=20;� �De-Yu Wang CSIE CYUT 37
6.4. CHAPTER 6.
4. �1 int a=10, b=20;� �
5. Lvalues and Rvalues
(a) Lvalues: 式 Lvalues�1 int a=20, b;
b = a;� �(b) Rvalues: 式 Rvalues�
int a=20, b;2 b = 10;� �
6.4
1. bytes (overflow)
2. short 32767�[dywang@dyw219 zzz]$ vim overflow1.c
2 [dywang@dyw219 zzz]$ cat overflow1.c#include <stdio.h>
4main() {
6 short a, b=32767;a = b + 1;
8 printf("32767 + 1 = %d\n", a);}� �
3. �1 [dywang@dyw219 zzz]$ gcc -o overflow1 overflow1.c� �
4. �1 [dywang@dyw219 zzz]$ ./overflow1
32767 + 1 = -32768� �De-Yu Wang CSIE CYUT 38
6.5. CHAR CHAPTER 6.
6.5 char
1. char 1 byte ASCII'A' 65
2. ASCII�[dywang@dyw219 zzz]$ vim char1.c
2 [dywang@dyw219 zzz]$ cat char1.c#include <stdio.h>
4main() {
6 char ch='A';printf("ASCII of A = %d\n", ch);
8 ch=65;printf("ASCII 65 = %c\n", ch);
10 }� �3. �
[dywang@dyw219 zzz]$ gcc -o char1 char1.c� �4. �
1 [dywang@dyw219 zzz]$ ./char1ASCII of A = 65
3 ASCII 65 = A� �5. �
1 char ch='6';char ch=6;� �
6.6
1. \ \n\t tab
2. man echo (escape sequcnce)�\\ backslash
2 \a alert (BEL)\b backspace
De-Yu Wang CSIE CYUT 39
6.7. CHAPTER 6.
4 \c produce no further output\e escape
6 \f form feed\n new line
8 \r carriage return\t horizontal tab
10 \v vertical tab� �3. (tab)�
[dywang@dyw219 zzz]$ vim char2.c2 [dywang@dyw219 zzz]$ cat char2.c
#include <stdio.h>4
main() {6 char ch1='\t', ch2='\n';
printf("A %c B %c", ch1,ch2);8 printf("ch1 = %d, ch2 = %d\n", ch1,ch2);
}� �4. �
1 [dywang@dyw219 zzz]$ gcc -o char2 char2.c� �5. %c char %d char ASCII�
1 [dywang@dyw219 zzz]$ ./char2A B
3 ch1 = 9, ch2 = 10� �
6.7
1. 語�1 (data type) variable_name� �
2.
De-Yu Wang CSIE CYUT 40
6.7. CHAPTER 6.
..long double.
double
.
float
.
unsigned long long
.
long long
.
unsigned long
.
long
.
unsigned int
.
int
3. �1 [dywang@dyw219 zzz]$ vim typetran1.c
[dywang@dyw219 zzz]$ cat typetran1.c3 #include <stdio.h>
5 main() {int n1, n2;
7 float f1=3.14159, f2=5.987;n1 = (int) f1;
9 n2 = (int) f2;printf("f1 = %f, n1 = %d\n", f1, n1);
11 printf("f2 = %f, n2 = %d\n", f2, n2);}� �
4. �[dywang@dyw219 zzz]$ gcc -o typetran1 typetran1.c� �
5. �1 [dywang@dyw219 zzz]$ ./typetran1
f1 = 3.141590, n1 = 33 f2 = 5.987000, n2 = 5� �
De-Yu Wang CSIE CYUT 41
6.8. CHAPTER 6.
6.8
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 dtype1.c unsigned short sidTAB dtype1
(b) 程式 dtype2.c short a b a 32000 32000 +800 = xxxxxx xxxxxx 程式 b = a + 800
dtype2
(c) 程式 dtype3.c char ch='#' ( )ASCII of # = XX ASCII XX = # XX #ASCII dtype3
(d) 程式 dtype4.c char ch1, ch2, ch3, ch4'\n', '4', '\t', 'g' ch2, ch3, ch4, ch3, ch2, ch1
dtype4
(e) dtype2.c 程式 dtype5.c b int 32000 + 800 =xxxxxx xxxxxx 程式 b = a + 800
a int dtype5
De-Yu Wang CSIE CYUT 42
Chapter 7
7.1 言
1. C 程式語言 Linux式 式 ( )
stdin getchar() gets() scanf()
stdout putchar() puts() printf()
stderr
7.2
1. �1 [dywang@dyw219 zzz]$ vim stdio1.c
[dywang@dyw219 zzz]$ cat stdio1.c3 #include <stdio.h>
5 main () {char c;
7printf( "Enter a character: ");
9 c = getchar( );printf( "You entered: ");
11 putchar(c);printf( "\n");
13 }� �2. �
1 [dywang@dyw219 zzz]$ gcc -o stdio1 stdio1.c� �3.
43
7.3. CHAPTER 7.
�1 [dywang@dyw219 zzz]$ ./stdio1
Enter a character: A3 You entered: A� �
7.3
1. �1 [dywang@dyw219 zzz]$ vim stdio2.c
[dywang@dyw219 zzz]$ cat stdio2.c3 #include <stdio.h>
5 main () {char str[100];
7printf( "Enter a string: ");
9 //gets(str);fgets(str, 100, stdin);
11 printf( "You entered: ");puts(str);
13 }� �2. stdio2 gcc gets 式�
1 [dywang@dyw219 zzz]$ gcc -o stdio2 stdio2.cstdio2.c: In function main:
3 stdio2.c:7:2: warning: gets is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
gets(str);5 ^� �
3. gets fgets�1 //gets(str);
fgets(str, 100, stdin);3 [dywang@dyw219 zzz]$ gcc -o stdio2 stdio2.c� �
4. �1 [dywang@dyw219 zzz]$ ./stdio2
Enter a string: qwe asd3 You entered: qwe asd� �
De-Yu Wang CSIE CYUT 44
7.4. CHAPTER 7.
7.4
1. stdio1.c stdio2.c�1 [dywang@dyw219 zzz]$ vim stdio3.c
[dywang@dyw219 zzz]$ cat stdio3.c3 #include <stdio.h>
5 main () {char c;
7 char str[100];
9 printf( "Enter a character: ");c = getchar( );
11 printf( "You entered: " );putchar(c);
13 printf( "\n" );printf( "Enter a string: ");
15 //gets( str );fgets( str, 100, stdin );
17 printf( "You entered: " );puts(str);
19 }� �2. �
1 [dywang@dyw219 zzz]$ gcc -o stdio3 stdio3.c� �3. A Enter 程式�
1 [dywang@dyw219 zzz]$ ./stdio3Enter a character: A
3 You entered: AEnter a string: You entered:� �
4. "A qwe rty" Enter " qwe rty"Enter getchar
fgets�1 [dywang@dyw219 zzz]$ gcc -o stdio3 stdio3.c
[dywang@dyw219 zzz]$ ./stdio33 Enter a character: A qwe rty
You entered: A5 Enter a string: You entered: qwe rty� �
5. 式 putchar 11.6 while
De-Yu Wang CSIE CYUT 45
7.5. CHAPTER 7.
7.5
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 getput1.c getcharputchar getput1
(b) 程式 getput2.c fgetsputs getput2
(c) 程式 getput3.c fgetsputs getchar
putchargetput3
De-Yu Wang CSIE CYUT 46
Chapter 8
式
8.1 言
1. stdio.h (standard input/output ) 式
2. 式 式 printf() 式
3. 式 式 scanf() 式
8.2 printf 式
1. printf 語 式 式 int�1 int printf(" 式 ", 1, 2, ...)� �
2. 式 %d, %s 式 id name式 %d %s�
1 printf("sid = %d, myname = %s\n", id, name)� �3. printf 式
式%c%d, %i%ld%e e 式%f 式%o%s%u%x%%
47
8.3. PRINTF CHAPTER 8. 式
4. �1 [dywang@dyw219 zzz]$ vim fstdio1.c
[dywang@dyw219 zzz]$ cat fstdio1.c3 #include <stdio.h>
5 main() {int pass=90;
7 printf("C %u%% PASS\n", pass);}� �
5. �[dywang@dyw219 zzz]$ gcc -o fstdio1 fstdio1.c
2 [dywang@dyw219 zzz]$ ./fstdio1C 90% PASS� �
8.3 printf
1. printf 式 式 (flags)
- %-4d 4+ %+5d 5(space) % 6f 6 10 0 %010.2f 10 2 5 0
2. �1 [dywang@dyw219 zzz]$ cat fstdio2.c
#include <stdio.h>3
main() {5 int a=-9, b=679, c=-679;
float d=-3.1415, e=3.1415, f=-792.324;7 printf("a=%-4d\tb=%+5d\tc=%+5d\n", a, b, c);
printf("d=% 6f\te=% 6f\tf=%010.2f\n", d, e, f);9 }� �
3. �[dywang@dyw219 zzz]$ gcc -o fstdio2 fstdio2.c� �
De-Yu Wang CSIE CYUT 48
8.4. SCANF 式 CHAPTER 8. 式
4. �1 [dywang@dyw219 zzz]$ ./fstdio2
a=-9 b= +679 c= -6793 d=-3.141500 e= 3.141500 f=-000792.32� �
8.4 scanf 式
1. scanf 語 式 式&
�1 int scanf(" 式 ", &1, &2, ...)� �
2. scanf 式式
%c%d%ld%e e 式%f 式%o%s%u%x
8.5 scanf
1. �1 [dywang@dyw219 zzz]$ vim fstdio3.c
[dywang@dyw219 zzz]$ cat fstdio3.c3 #include <stdio.h>
5 main() {int a, b;
7 printf("Enter TWO integers:\n");scanf("%d %d", &a, &b);
9 printf("%d * %d = %d\n", a, b, a*b);}� �
2.
De-Yu Wang CSIE CYUT 49
8.5. SCANF CHAPTER 8. 式
�[dywang@dyw219 zzz]$ gcc -o fstdio3 fstdio3.c� �
3. �1 [dywang@dyw219 zzz]$ ./fstdio3
Enter TWO integers:3 12 -9
12 * -9 = -108� �4. 程式 scanf 式 &�
scanf("%d %d", a, b);� �5. 式
�1 [dywang@dyw219 zzz]$ vim fstdio4.c
[dywang@dyw219 zzz]$ cat fstdio4.c3 #include <stdio.h>
5 main() {float a, b;
7 printf("Input TWO floats: %%f %%e\n");scanf("%f %e", &a, &b);
9 printf("%f * %e = %e\n", a, b, a*b);}� �
6. �[dywang@dyw219 zzz]$ gcc -o fstdio4 fstdio4.c� �
7. �1 [dywang@dyw219 zzz]$ ./fstdio4
Input TWO floats: %f %e3 3.2345 1.28e3
3.234500 * 1.280000e+03 = 4.140160e+03� �8. 程式 scanf 式 , 程式
De-Yu Wang CSIE CYUT 50
8.6. SCANF CHAPTER 8. 式
�scanf("%f %e", a, b);� �
8.6 scanf
1. ACSII code�1 [dywang@dyw219 zzz]$ vim fstdio5.c
[dywang@dyw219 zzz]$ cat fstdio5.c3 #include <stdio.h>
5 main() {char a;
7 printf("Enter a character: ");scanf("%c", &a);
9 printf("char=%c\tASCII code=%d\n", a, a);}� �
2. �[dywang@dyw219 zzz]$ gcc -o fstdio5 fstdio5.c� �
3. �1 [dywang@dyw219 zzz]$ ./fstdio5
Enter a character: H3 char=H ASCII code=72� �
4. IP�1 [dywang@dyw219 zzz]$ vim fstdio6.c
[dywang@dyw219 zzz]$ cat fstdio6.c3 #include <stdio.h>
5 main() {char a[20];
7 printf("Enter your ip: ");scanf("%s", &a);
9 printf("Your IP: %s\n", a);}� �
5.
De-Yu Wang CSIE CYUT 51
8.7. SCANF CHAPTER 8. 式
�[dywang@dyw219 zzz]$ gcc -o fstdio6 fstdio6.c� �
6. �1 [dywang@dyw219 zzz]$ ./fstdio6
Enter your ip: 192.168.1.1403 Your IP: 192.168.1.140� �
7. a 20 20�1 char a[20];� �
8.7 scanf
1. scanf�1 [dywang@dyw219 zzz]$ vim fstdio7.c
[dywang@dyw219 zzz]$ cat fstdio7.c3 #include <stdio.h>
5 main() {int a;
7 printf("Enter a number: ");scanf("%d", &a);
9 printf("a=%d\n", a);}� �
2. �[dywang@dyw219 zzz]$ gcc -o fstdio7 fstdio7.c� �
3. 345�1 [dywang@dyw219 zzz]$ ./fstdio7
Enter a number: 3453 a=345� �
4. qwe123 0
De-Yu Wang CSIE CYUT 52
8.8. SCANF CHAPTER 8. 式
�1 [dywang@dyw219 zzz]$ ./fstdio7
Enter a number: qwe1233 a=0� �
5. 456rty 456
�1 [dywang@dyw219 zzz]$ ./fstdio7
Enter a number: 456rty3 a=456� �
6. " 897yui" 897
�1 [dywang@dyw219 zzz]$ ./fstdio7
Enter a number: 897yui3 a=897� �
7.
8.8 scanf
1. scanf
2. fstdio7.c�1 [dywang@dyw219 zzz]$ vim fstdio8.c
[dywang@dyw219 zzz]$ cat fstdio8.c3 #include <stdio.h>
5 main() {int a;
7 char b[10];printf("Enter a number: ");
9 scanf("%d", &a);printf("a=%d\n", a);
11 printf("Enter a string: ");scanf("%s", &b);
13 printf("b=%s\n", b);}� �
3.
De-Yu Wang CSIE CYUT 53
8.9. SCANF CHAPTER 8. 式
�[dywang@dyw219 zzz]$ gcc -o fstdio8 fstdio8.c� �
4. 482abc Enter 程式 482abc
�1 [dywang@dyw219 zzz]$ ./fstdio8
Enter a number: 482abc3 a=482
Enter a string: b=abc� �5. 123 Enter abc�
[dywang@dyw219 zzz]$ ./fstdio82 Enter a number: 123
a=1234 Enter a string: abc
b=abc� �6. scanf scanf
8.9 scanf
1. fstdio8.c ACSII code�1 [dywang@dyw219 zzz]$ vim fstdio9.c
[dywang@dyw219 zzz]$ cat fstdio9.c3 #include <stdio.h>
5 main() {int a;
7 char b;printf("Enter a number: ");
9 scanf("%d", &a);printf("a=%d\n", a);
11 printf("Enter a character: ");scanf("%c", &b);
13 printf("b=%c\tACSII code=%d\n", b,b);}� �
2.
De-Yu Wang CSIE CYUT 54
8.10. SCANF CHAPTER 8. 式
�[dywang@dyw219 zzz]$ gcc -o fstdio9 fstdio9.c� �
3. 123 Enter 程式ACSII code=10 ascii code 10 Enter
b=�1 [dywang@dyw219 zzz]$ ./fstdio9
Enter a number: 1233 a=123
Enter a character: b=5 ACSII code=10� �
4.
8.10 scanf
1. fstdio9.cfflush(stdin) 式
式 \n�1 [dywang@dyw219 zzz]$ vim fstdio10.c
[dywang@dyw219 zzz]$ cat fstdio10.c3 #include <stdio.h>
5 main() {int a;
7 char b;printf("Enter a number: ");
9 scanf("%d", &a);printf("a=%d\n", a);
11 printf("Enter a character: ");scanf("\n%c", &b);
13 printf("b=%c\tACSII code=%d\n", b,b);}� �
2. �[dywang@dyw219 zzz]$ gcc -o fstdio10 fstdio10.c� �
3. 123 Enter w 程式w ACSII code=119
De-Yu Wang CSIE CYUT 55
8.11. CHAPTER 8. 式
�1 [dywang@dyw219 zzz]$ ./fstdio10
Enter a number: 1233 a=123
Enter a character: w5 b=w ACSII code=119� �
4. 123w Enter w ACSIIcode=119�1 [dywang@dyw219 zzz]$ ./fstdio10
Enter a number: 123w3 a=123
Enter a character: b=w ACSII code=119� �
8.11
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 formatio1.c fgetsformatio1 string test!( )�
13 "string test!"� �include string.h strlen
'\n' '\0'(b) formatio1.c 程式 formatio2.c fgets
5 2 式 123.45num=00123.45 formatio2
include stdlib.h atof 式 double printf
(c) 程式 formatio3.c IP ( ) scanf( IP
式) 192.168.1.IP , , ( "," )10927000 111
formatio3
De-Yu Wang CSIE CYUT 56
8.11. CHAPTER 8. 式
�1
IP 10927000 1113 192.168.1.111,10927000,� �
(d) 程式 formatio4.c scanfformatio4�
Enter TWO numbers with two chars: 12we342 e-w : 12 + 34 = 46� �
(e) 程式 formatio5.c scanfformatio5
scanf 式 %s %[^0-9-]�Enter TWO numbers with a string: -98qwert-12
2 qwert : -98 + -12 = -110� �
De-Yu Wang CSIE CYUT 57
Chapter 9
9.1 式
1. 式 (operand) (operator)�c = a + 3;� �
(a) c, a 3
(b) = +
2. = a + 3c = (assignment operator)
3. ...
4. 式 ...
9.2
1. (unary operator) + +6 6 6- -6 6! NOT !b b NOT
2. �1 [dywang@dyw219 zzz]$ vim op-un1.c
[dywang@dyw219 zzz]$ cat op-un1.c3 #include <stdio.h>
5 main() {int a, c=-6;
7 a = +c;printf("a = +c = %d\n", a);
9 a = -c;
58
9.3. CHAPTER 9.
printf("a = -c = %d\n", a);11 a = !c;
printf("a = !c = %d\n", a);13 }� �
3. �1 [dywang@dyw219 zzz]$ gcc -o op-un1 op-un1.c� �
4. �1 [dywang@dyw219 zzz]$ ./op-un1
a = +c = -63 a = -c = 6
a = !c = 0� �
9.3
1. (Arithmetic Operators)
+ a+6 a + 6- a-6 a - 6* a*6 a * 6/ a/6 a / 6% a%6 a / 6++ a++, ++a a 1-- a--, --a a 1
2. �[dywang@dyw219 zzz]$ vim op-ari1.c
2 [dywang@dyw219 zzz]$ cat op-ari1.c#include <stdio.h>
4main() {
6 int a, c=5;a = c + 3;
8 printf("a = c + 3 = %d\n", a);a = c - 3;
10 printf("a = c - 3 = %d\n", a);a = c * 3;
12 printf("a = c * 3 = %d\n", a);a = c / 3;
14 printf("a = c / 3 = %d\n", a);a = c % 3;
16 printf("a = c % 3 = %d\n", a);
De-Yu Wang CSIE CYUT 59
9.4. CHAPTER 9.
a = c++;18 printf("a = c++ = %d, c = %d\n", a, c);
a = ++c;20 printf("a = ++c = %d, c = %d\n", a, c);
a = c--;22 printf("a = c-- = %d, c = %d\n", a, c);
a = --c;24 printf("a = --c = %d, c = %d\n", a, c);
}� �3. �
1 [dywang@dyw219 zzz]$ gcc -o op-ari1 op-ari1.c� �4. �
1 [dywang@dyw219 zzz]$ ./op-ari1a = c + 3 = 8
3 a = c - 3 = 2a = c * 3 = 15
5 a = c / 3 = 1a = c % 3 = 2
7 a = c++ = 5, c = 6a = ++c = 7, c = 7
9 a = c-- = 7, c = 6a = --c = 5, c = 5� �
9.4
1. (Relational Operators)
== a==6 a 6!= a!=6 a 6> a>6 a 6< a<6 a 6>= a>=6 a 6<= a<=6 a 6
2. �[dywang@dyw219 zzz]$ vim op-rel1.c
2 [dywang@dyw219 zzz]$ cat op-rel1.c#include <stdio.h>
4main() {
6 int a, b;
De-Yu Wang CSIE CYUT 60
9.4. CHAPTER 9.
8 printf("Enter TWO integers: ");scanf("%d %d", &a, &b);
10if ( a == b ) printf("%d == %d\n", a, b );
12 if ( a != b ) printf("%d != %d\n", a, b );if ( a > b ) printf("%d > %d\n", a, b );
14 if ( a < b ) printf("%d < %d\n", a, b );if ( a >= b ) printf("%d >= %d\n", a, b );
16 if ( a <= b ) printf("%d <= %d\n", a, b );}� �
3. �1 [dywang@dyw219 zzz]$ gcc -o op-rel1 op-rel1.c� �
4. �1 [dywang@dyw219 zzz]$ ./op-rel1
Enter TWO integers: 2 33 2 != 3
2 < 3� �5. �
[dywang@dyw219 zzz]$ ./op-rel12 Enter TWO integers: 3 3
3 == 34 3 >= 3
3 <= 3� �6. �
1 [dywang@dyw219 zzz]$ ./op-rel1Enter TWO integers: 4 2
3 4 != 24 > 2
5 4 >= 2� �
De-Yu Wang CSIE CYUT 61
9.5. CHAPTER 9.
9.5
1. (Logical Operators) && AND a&&b a AND b|| OR a||b a OR b! NOT !a NOT a
2. �1 [dywang@dyw219 zzz]$ vim op-log1.c
[dywang@dyw219 zzz]$ cat op-log1.c3 #include <stdio.h>
5 main() {int a, b;
7printf("Enter TWO integers: ");
9 scanf("%d %d", &a, &b);
11 if ( a>0 && b>0 ) printf("%d>0 AND %d>0\n", a, b );if ( a>0 || b>0 ) printf("%d>0 OR %d>0\n", a, b );
13 if ( !( a>0 ) ) printf("NOT %d>0\n", a );}� �
3. �[dywang@dyw219 zzz]$ gcc -o op-log1 op-log1.c� �
4. �1 [dywang@dyw219 zzz]$ ./op-log1
Enter TWO integers: 2 33 2>0 AND 3>0
2>0 OR 3>0� �5. �
[dywang@dyw219 zzz]$ ./op-log12 Enter TWO integers: 2 -3
2>0 OR -3>0� �6.
De-Yu Wang CSIE CYUT 62
9.6. BITWISE CHAPTER 9.
�1 [dywang@dyw219 zzz]$ ./op-log1
Enter TWO integers: -2 53 -2>0 OR 5>0
NOT -2>0� �
9.6 Bitwise
1. bitwise 式 and, or, exclusiveor,complement, left shift, right shiftp q p&q p|q p^q0 0 0 0 00 1 0 1 11 1 1 1 01 0 0 1 1
2. A=60(00111100) B=13(00001101)
& Binary AND (A&B)=12 (00001100)| Binary OR (A|B)=61 (00111101)^ Binary XOR (A^B)=49 (00110001)~ Binary Ones complement (~A)=-61 (11000011)<< Binary left shift A<<2=240 (11110000)>> Binary right shift A>>2=15 (00001111)
3. 程式 A=60(00111100) B=13(00001101)�[dywang@dyw219 zzz]$ vim op-bw1.c
2 [dywang@dyw219 zzz]$ cat op-bw1.c#include <stdio.h>
4main() {
6 unsigned int a = 60; /* 60 = 0011 1100 */unsigned int b = 13; /* 13 = 0000 1101 */
8 int c = 0;
10 c = a & b; /* 12 = 0000 1100 */printf("00111100 & 00001101 = %d (00001100)\n", c );
12c = a | b; /* 61 = 0011 1101 */
14 printf("00111100 | 00001101 = %d (00111101)\n", c );
16 c = a ^ b; /* 49 = 0011 0001 */printf("00111100 ^ 00001101 = %d (00110001)\n", c );
18c = ~a; /*-61 = 1100 0011 */
20 printf("~00111100 = %d (11000011)\n", c );
22 c = a << 2; /* 240 = 1111 0000 */
De-Yu Wang CSIE CYUT 63
9.7. CHAPTER 9.
printf("00111100 << 2 = %d (11110000)\n", c );24
c = a >> 2; /* 15 = 0000 1111 */26 printf("00111100 >> 2 = %d (00001111)\n", c );
}� �4. �
1 [dywang@dyw219 zzz]$ gcc -o op-bw1 op-bw1.c� �5. �
1 [dywang@dyw219 zzz]$ ./op-bw100111100 & 00001101 = 12 (00001100)
3 00111100 | 00001101 = 61 (00111101)00111100 ^ 00001101 = 49 (00110001)
5 ~00111100 = -61 (11000011)00111100 << 2 = 240 (11110000)
7 00111100 >> 2 = 15 (00001111)� �6. bc�
1 [dywang@dyw219 zzz]$ echo 'obase=2;15' | bc1111
3 [dywang@dyw219 zzz]$ echo 'obase=2;240' | bc11110000� �
9.7
1. (Assignment Operators)
= C=A+B+= C+=A, C=C+A-= C-=A, C=C-A*= C*=A, C=C*A/= C/=A, C=C/A%= C%=A, C=C%A<<= left shift C<<2, C=C<<2>>= right shift C>>2, C=C>>2&= bitwise AND C&=2, C=C&2^= bitwise exclusive OR C^=2, C=C^2|= bitwise OR C|=2, C=C|2
De-Yu Wang CSIE CYUT 64
9.7. CHAPTER 9.
2. 程式�[dywang@dyw219 zzz]$ vim op-as1.c
2 [dywang@dyw219 zzz]$ cat op-as1.c#include <stdio.h>
4main() {
6 int a, c;
8 printf("Enter an integer: ");scanf("%d", &a);
10c = a;
12 printf("c = a, c = %d\n", c );
14 c += a;printf("c += a, c = %d\n", c );
16c -= a;
18 printf("c -= a, c = %d\n", c );
20 c *= a;printf("c *= a, c = %d\n", c );
22c /= a;
24 printf("c /= a, c = %d\n", c );
26 c = 200;c %= a;
28 printf("c = 200\nc %= a, c = %d\n", c );
30 a <<= 2;printf("a <<= 2, a = %d\n", a );
32a >>= 2;
34 printf("a >>= 2, a = %d\n", a );
36 a &= 2;printf("a &= 2, a = %d\n", a );
38a ^= 2;
40 printf("a ^= 2, a = %d\n", a );
42 a |= 2;printf("a |= 2, a = %d\n", a );
44 }� �3. �
[dywang@dyw219 zzz]$ gcc -o op-as1 op-as1.c� �
De-Yu Wang CSIE CYUT 65
9.8. CHAPTER 9.
4. �1 [dywang@dyw219 zzz]$ ./op-as1
Enter an integer: 213 c = a, c = 21
c += a, c = 425 c -= a, c = 21
c *= a, c = 4417 c /= a, c = 21
c = 2009 c %= a, c = 11
a <<= 2, a = 8411 a >>= 2, a = 21
a &= 2, a = 013 a ^= 2, a = 2
a |= 2, a = 2� �
9.8
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 operator1.c scanf ---- 7 25 25 -- 77 -- 4
operator1 F = 9/5 * C + 32
(b) 程式 operator2.c scanf 1 =1.609344 25 25 mi = 40.23 km
operator2
(c) 程式 operator3.c scanf a bint
operator3 if 式
�arithmetic expression: 98+-12
2 a + b = 98 + -12 = 86arithmetic expression: 98--12
4 a - b = 98 - -12 = 110arithmetic expression: 98*-12
6 a * b = 98 * -12 = -1176arithmetic expression: 98/-12
8 a / b = 98 / -12 = -8� �De-Yu Wang CSIE CYUT 66
9.8. CHAPTER 9.
(d) operator3.c 程式 operator4.c scanf a bb
b b boperator4 if 式
�arithmetic expression: 98+-12
2 a + b = 98 - 12 = 86arithmetic expression: 98--12
4 a - b = 98 + 12 = 110arithmetic expression: 98*-12
6 a * b = 98 * -12 = -1176arithmetic expression: 98/-12
8 a / b = 98 / -12 = -8� �(e) 程式 operator5.c scanf a b
a, b bitwise 式operator5�
Enter TWO numbers: 3 72 3 & 7 = 3
3 | 7 = 74 3 ^ 7 = 4
~3 = -4, ~7 = -86 3 >> 1 = 1, 7 << 2 = 28� �
De-Yu Wang CSIE CYUT 67
Chapter 10
10.1 言
1. C 語言 non-zero, non-null true zero null false
2. 程式
3. C 語言 if, if...else, switch, ?:
10.2 if statement
1. 程
..
condition?
.
condition code
..
true
.
false
2. 語 �if(boolean_expression)
2 {/* statement(s) will execute if the boolean expression is true */
4 }� �3. �
[dywang@dyw219 zzz]$ vim if1.c2 [dywang@dyw219 zzz]$ cat if1.c
68
10.2. IF STATEMENT CHAPTER 10.
#include <stdio.h>4
main() {6 int a;
8 printf("Enter an integer: ");scanf("%d", &a);
10if ( a>10 ) {
12 printf("%d > 10\n", a);}
14 printf("a = %d\n", a );}� �
4. �1 [dywang@dyw219 zzz]$ gcc -o if1 if1.c� �
5. �1 [dywang@dyw219 zzz]$ ./if1
Enter an integer: 33 a = 3� �
6. �1 [dywang@dyw219 zzz]$ ./if1
Enter an integer: 133 13 > 10
a = 13� �
De-Yu Wang CSIE CYUT 69
10.3. IF...ELSE STATEMENT CHAPTER 10.
10.3 if...else statement
1. 程
..
condition?
.
ture conditioncode
.
false conditioncode
..
true
.
false
2. 語 �if(boolean_expression)
2 {/* statement(s) will execute if the boolean expression is true */
4 }else
6 {/* statement(s) will execute if the boolean expression is false */
8 }� �3. �
[dywang@dyw219 zzz]$ vim if2.c2 [dywang@dyw219 zzz]$ cat if2.c
#include <stdio.h>4
main() {6 int a;
8 printf("Enter an integer: ");scanf("%d", &a);
10if ( a>10 ) {
12 printf("%d > 10\n", a);}
14 else {printf("%d <= 10\n", a);
16 }printf("a = %d\n", a );
18 }� �4.
De-Yu Wang CSIE CYUT 70
10.4. NESTED IF STATEMENTS CHAPTER 10.
�[dywang@dyw219 zzz]$ gcc -o if2 if2.c� �
5. �1 [dywang@dyw219 zzz]$ ./if2
Enter an integer: 73 7 <= 10
a = 7� �6. �
[dywang@dyw219 zzz]$ ./if22 Enter an integer: 19
19 > 104 a = 19� �
10.4 nested if statements
1. 語 �if( boolean_expression 1)
2 {/* Executes when the boolean expression 1 is true */
4 if(boolean_expression 2){
6 /* Executes when the boolean expression 2 is true */}
8 }� �2. �
[dywang@dyw219 zzz]$ cat if3.c2 #include <stdio.h>
4 main() {int a;
6printf("Enter an integer: ");
8 scanf("%d", &a);
10 if ( a>10 ) {printf("%d > 10\n", a);
12 if ( a<100) {
De-Yu Wang CSIE CYUT 71
10.4. NESTED IF STATEMENTS CHAPTER 10.
printf("%d < 100\n", a);14 }
}16 else {
printf("a <= %d\n", a);18 }
printf("a = %d\n", a );20 }� �
3. �[dywang@dyw219 zzz]$ gcc -o if3 if3.c� �
4. �1 [dywang@dyw219 zzz]$ ./if3
Enter an integer: 53 a <= 5
a = 5� �5. �
[dywang@dyw219 zzz]$ ./if32 Enter an integer: 49
49 > 104 49 < 100
a = 49� �6. �
1 [dywang@dyw219 zzz]$ ./if3Enter an integer: 200
3 200 > 10a = 200� �
De-Yu Wang CSIE CYUT 72
10.5. IF...ELSE IF...ELSE STATEMENT CHAPTER 10.
10.5 if...else if...else Statement
1. 程
..
condition 1?
.
ture condition 1code
.
condition 2?
.
true condition 2code
..
true
.
false
.
true
.
false
2. 語 �if(boolean_expression 1)
2 {/* Executes when the boolean expression 1 is true */
4 }else if( boolean_expression 2)
6 {/* Executes when the boolean expression 2 is true */
8 }else if( boolean_expression 3)
10 {/* Executes when the boolean expression 3 is true */
12 }else
14 {/* executes when the none of the above condition is true */
16 }� �3. �
[dywang@dyw219 zzz]$ vim if4.c2 [dywang@dyw219 zzz]$ cat if4.c
#include <stdio.h>4
main() {6 int a;
8 printf("Enter an integer: ");scanf("%d", &a);
10if ( a>10 ) {
12 printf("%d > 10\n", a);}
14 else if ( a<10) {printf("%d < 10\n", a);
De-Yu Wang CSIE CYUT 73
10.6. ?: CHAPTER 10.
16 }else {
18 printf("a = 10\n");}
20 }� �4. �
[dywang@dyw219 zzz]$ gcc -o if4 if4.c� �5. �
1 [dywang@dyw219 zzz]$ ./if4Enter an integer: 20
3 20 > 10� �6. �
1 [dywang@dyw219 zzz]$ ./if4Enter an integer: 8
3 8 < 10� �7. �
1 [dywang@dyw219 zzz]$ ./if4Enter an integer: 10
3 a = 10� �
10.6 ?:
1. 語 Exp1 true Exp2 Exp3 varif...else 語 ?: 程式�1 var = Exp1 ? Exp2 : Exp3;� �
2.
De-Yu Wang CSIE CYUT 74
10.6. ?: CHAPTER 10.
�1 [dywang@dyw219 zzz]$ vim if5.c
[dywang@dyw219 zzz]$ cat if5.c3 #include <stdio.h>
5 main() {int a, c;
7printf("Enter an integer: ");
9 scanf("%d", &a);
11 c = ( a>0 ) ? a : -a;printf("a = %d, c = %d\n", a, c );
13 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o if5 if5.c� �4. �
1 [dywang@dyw219 zzz]$ ./if5Enter an integer: 10
3 a = 10, c = 10� �5. �
1 [dywang@dyw219 zzz]$ ./if5Enter an integer: -10
3 a = -10, c = 10� �
De-Yu Wang CSIE CYUT 75
10.7. SWITCH STATEMENT CHAPTER 10.
10.7 switch statement
1. 程
..
expression?
.
code block 1
.
code block 2
..
code block 3
..
...
.
...
.
code block N
..
case 1
.
case 2
.
case 3
.
default
2. 語 break break�1 switch(expression){
case constant-expression :3 statement(s);
break; /* optional */5 case constant-expression :
statement(s);7 break; /* optional */
9 /* you can have any number of case statements */default : /* Optional */
11 statement(s);}� �
3. �[dywang@dyw219 zzz]$ vim sw1.c
2 [dywang@dyw219 zzz]$ cat sw1.c#include <stdio.h>
4main () {
6 char grade;printf("Enter a char: ");
8 scanf("%c", &grade);
10 switch(grade) {case 'A' :
12 printf("Excellent!\n" );break;
14 case 'B' :
De-Yu Wang CSIE CYUT 76
10.7. SWITCH STATEMENT CHAPTER 10.
case 'C' :16 printf("Well done\n" );
break;18 case 'D' :
printf("You passed\n" );20 break;
case 'F' :22 printf("Better try again\n" );
break;24 default :
printf("Invalid grade\n" );26 }
printf("Your grade is %c\n", grade );28 }� �
4. �[dywang@dyw219 zzz]$ gcc -o sw1 sw1.c� �
5. �1 [dywang@dyw219 zzz]$ ./sw1
Enter a char: A3 Excellent!
Your grade is A� �6. A, C, D, F�
[dywang@dyw219 zzz]$ ./sw12 Enter a char: C
Well done4 Your grade is C
[dywang@dyw219 zzz]$ ./sw16 Enter a char: D
You passed8 Your grade is D
[dywang@dyw219 zzz]$ ./sw110 Enter a char: F
Better try again12 Your grade is F� �
7. B breakcase 式 "well done"�
[dywang@dyw219 zzz]$ ./sw1
De-Yu Wang CSIE CYUT 77
10.8. GOTO STATEMENT CHAPTER 10.
2 Enter a char: BWell done
4 Your grade is B� �8. E 43 "Invalid grade"�
[dywang@dyw219 zzz]$ ./sw12 Enter a char: E
Invalid grade4 Your grade is E
[dywang@dyw219 zzz]$ ./sw16 Enter a char: 43
Invalid grade8 Your grade is 4� �
10.8 goto statement
1. goto 程式 語 goto ( )
�label_name:
2 statement(s);.....
4goto label_name;� �
2. �1 [dywang@dyw219 zzz]$ vim goto1.c
[dywang@dyw219 zzz]$ cat goto1.c3 #include <stdio.h>
5 main() {int i=0, a, sum=0;
7printf("Enter an integer: ");
9 scanf("%d", &a);
11 add_start:printf("%d", ++i );
13 sum += i;if ( i<a ) {
15 printf("+");goto add_start;
17 }printf("=%d\n", sum );
De-Yu Wang CSIE CYUT 78
10.9. NESTED SWITCH STATEMENTS CHAPTER 10.
19 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o goto1 goto1.c� �4. �
1 [dywang@dyw219 zzz]$ ./goto1Enter an integer: 10
3 1+2+3+4+5+6+7+8+9+10=55[dywang@dyw219 zzz]$ ./goto1
5 Enter an integer: 71+2+3+4+5+6+7=28� �
10.9 nested switch statements
1. 語 �switch(ch1) {
2 case 'A':printf("This A is part of outer switch" );
4 switch(ch2) {case 'A':
6 printf("This A is part of inner switch" );break;
8 case 'B': /* case code */}
10 break;case 'B': /* case code */
12 }� �
10.10
1.
(a) zzz
(b) zzz
(c)
De-Yu Wang CSIE CYUT 79
10.10. CHAPTER 10.
2. C 語言程式
(a) 程式 choice1.c scanf a ba b a+b a-ba=4, b=3 4 + 3 = 7
choice1
(b) 程式 choice2.c scanf a ba b a b binary XOR a b binaryAND a=4, b=3 4 & 3 = 0
choice2
(c) 程式 choice3.c scanf 3-5 Spring, 6-8Summer 9-11 Autumn 12-2 Winter
11 11 : Autumn 13 13 : NOT the monthchoice3
(d) 程式 choice4.c choice1.c if 式 ?:choice4
(e) 程式 choice5.c choice2.c if 式 ?:choice5
(f) 程式 choice6.c choice3.c if 式 switch 式choice6 1, 2, 3, 4 1
12 switch1 程式 a b
�b = (a>0 && a<13) ? (a%12)/3+1 : a;� �
(g) 程式 choice7.c scanf a bSTARTADD label goto a b
a=3, b=6 3+4+5+6=18choice7
(h) choice7.c 程式 choice8.c a bchoice8
De-Yu Wang CSIE CYUT 80
Chapter 11
11.1 言
1. (loop)
2.
3. 言 for
4. while do...while
5. do...while
11.2 for loop
1. for 程
..
init
.
condition?
.
block code
.
increment
..
true
.
false
.
2. 語 init condition increment
81
11.2. FOR LOOP CHAPTER 11.
�1 for ( init; condition; increment )
{3 statement(s);
}� �3. 1�
[dywang@dyw219 zzz]$ vim for1.c2 [dywang@dyw219 zzz]$ cat for1.c
#include <stdio.h>4
main() {6 int i, a, sum=0;
8 printf("Enter an integer: ");scanf("%d", &a);
10for ( i=1; i<a; i++) {
12 printf("%d+", i );sum += i;
14 }sum += i;
16 printf("%d=%d\n", i,sum );}� �
4. �1 [dywang@dyw219 zzz]$ gcc -o for1 for1.c� �
5. �1 [dywang@dyw219 zzz]$ ./for1
Enter an integer: 103 1+2+3+4+5+6+7+8+9+10=55
[dywang@dyw219 zzz]$ ./for15 Enter an integer: 8
1+2+3+4+5+6+7+8=36� �
De-Yu Wang CSIE CYUT 82
11.3. WHILE LOOP CHAPTER 11.
11.3 while loop
1. 程 ..
condition?
.
block code
..
true
.
false
.
2. 語 condition�while(condition)
2 {statement(s);
4 }� �3. 1�
[dywang@dyw219 zzz]$ vim while1.c2 [dywang@dyw219 zzz]$ cat while1.c
#include <stdio.h>4
main() {6 int i=1, a, sum=0;
8 printf("Enter an integer: ");scanf("%d", &a);
10while ( sum < a ) {
12 printf("%d+", i++ );sum += i;
14 }printf("%d=%d\n", i,sum );
16 }� �4. �
[dywang@dyw219 zzz]$ gcc -o while1 while1.c� �
De-Yu Wang CSIE CYUT 83
11.4. DO...WHILE LOOP CHAPTER 11.
5. �1 [dywang@dyw219 zzz]$ ./while1
Enter an integer: 233 1+2+3+4+5+6+7=27
[dywang@dyw219 zzz]$ ./while15 Enter an integer: 76
1+2+3+4+5+6+7+8+9+10+11+12=777 Enter an integer: 10
1+2+3+4+5+6+7+8+9+10=55� �6. 0 1=0�
[dywang@dyw219 zzz]$ ./while12 Enter an integer: -3
1=04 [dywang@dyw219 zzz]$ ./while1
Enter an integer: 06 1=0� �
11.4 do...while loop
1. 程 ..
block code
.
condition?
..
false
.
true
2. 語 condition�do {
2 statement(s);
4 }while( condition );� �3. 1 do...while
�[dywang@dyw219 zzz]$ vim dowhile1.c
De-Yu Wang CSIE CYUT 84
11.5. CHAPTER 11.
2 [dywang@dyw219 zzz]$ cat dowhile1.c#include <stdio.h>
4main() {
6 int i=1, a, sum=0;
8 do {printf("Enter an integer: ");
10 scanf("%d", &a);} while ( a<=0 );
12while ( sum < a ) {
14 printf("%d+", i++ );sum += i;
16 }printf("%d=%d\n", i,sum );
18 }� �4. �
[dywang@dyw219 zzz]$ gcc -o dowhile1 dowhile1.c� �5. 0 -3 程式 25
�1 [dywang@dyw219 zzz]$ ./dowhile1
Enter an integer: 03 Enter an integer: -3
Enter an integer: 255 1+2+3+4+5+6+7=27� �
11.5
1. (endless loops) 程
2. 1999�1 [dywang@dyw219 zzz]$ vim endlessloop1.c
[dywang@dyw219 zzz]$ cat endlessloop1.c3 #include <stdio.h>
5 main() {int i=1, a, sum=0;
7do {
De-Yu Wang CSIE CYUT 85
11.6. CHAPTER 11.
9 printf("Enter an integer: ");scanf("%d", &a);
11 } while ( a!=1999 );
13 while ( sum < a ) {printf("%d+", i++ );
15 sum += i;}
17 printf("%d=%d\n", i,sum );}� �
3. �[dywang@dyw219 zzz]$ gcc -o endlessloop1 endlessloop1.c� �
4. 34, 23, 56, -2, 90 程式Ctrl+C 程式�
1 [dywang@dyw219 zzz]$ ./endlessloop1Enter an integer: 34
3 Enter an integer: 23Enter an integer: 56
5 Enter an integer: -2Enter an integer: 90
7 Enter an integer: ^C� �
11.6
1.
2. for, while, do...while {..}
�1 for (i=1; i<=a; i++)
print("i=%d\n", i);� �3. for ";"
for�for (i=1; i<=a; i++);
2 print("i=%d\n", i);� �
De-Yu Wang CSIE CYUT 86
11.6. CHAPTER 11.
4. 程式 程式 CPU
5. 程式
6. �[dywang@dyw219 zzz]$ vim nullloop1.c
2 [dywang@dyw219 zzz]$ cat nullloop1.c#include <stdio.h>
4main() {
6 int i=1, a;
8 do {printf("Enter an integer: ");
10 scanf("%d", &a);} while ( a<=0 );
12for (i=1; i<=a; i++);
14 printf("i=%d\n", i );}� �
7. �1 [dywang@dyw219 zzz]$ gcc -o nullloop1 nullloop1.c� �
8. 程式�1 [dywang@dyw219 zzz]$ ./nullloop1
Enter an integer: 103 i=11
[dywang@dyw219 zzz]$ time ./nullloop15 Enter an integer: 100
i=1017
real 0m1.767s9 user 0m0.000s
sys 0m0.002s11 [dywang@dyw219 zzz]$ time ./nullloop1
Enter an integer: 100000013 i=1000001
15 real 0m3.059suser 0m0.004s
17 sys 0m0.002s[dywang@dyw219 zzz]$ time ./nullloop1
19 Enter an integer: 100000000i=100000001
21
De-Yu Wang CSIE CYUT 87
11.7. BREAK CHAPTER 11.
real 0m16.439s23 user 0m0.271s
sys 0m0.002s� �9. 7.4 stdio3.c Enter
11.7 break
1. break
2. for 10
�[dywang@dyw219 zzz]$ vim forbreak1.c
2 [dywang@dyw219 zzz]$ cat forbreak1.c#include <stdio.h>
4main() {
6 int i, a;
8 printf("Enter an integer: ");scanf("%d", &a);
10for ( i=1; i<a; i++) {
12 if (!(i%10)) break;}
14 printf("i = %d\n", i);}� �
3. �1 [dywang@dyw219 zzz]$ gcc -o forbreak1 forbreak1.c� �
4. 10 for 17 i=10
�1 [dywang@dyw219 zzz]$ ./forbreak1
Enter an integer: 43 i = 4
[dywang@dyw219 zzz]$ ./forbreak15 Enter an integer: 17
i = 10� �
De-Yu Wang CSIE CYUT 88
11.8. CONTINUS CHAPTER 11.
11.8 continus
1. continus continus
2. 4�[dywang@dyw219 zzz]$ vim forcontinus1.c
2 [dywang@dyw219 zzz]$ cat forcontinus1.c#include <stdio.h>
4main() {
6 int i, a, sum=0;
8 printf("Enter an integer: ");scanf("%d", &a);
10for ( i=1; i<a; i++) {
12 if (!(i%4)) continue;sum += i;
14 }printf("sum = %d\n", sum);
16 }� �3. �
[dywang@dyw219 zzz]$ gcc -o forcontinus1 forcontinus1.c� �4. 13 12�
1 [dywang@dyw219 zzz]$ ./forcontinus1Enter an integer: 13
3 sum = 54[dywang@dyw219 zzz]$ ./forcontinus1
5 Enter an integer: 12sum = 54
7 [dywang@dyw219 zzz]$ ./forcontinus1Enter an integer: 7
9 sum = 17� �
11.9 式
1. 式 (nested loops) for, while, do...while式 語 for while, do...while
式
De-Yu Wang CSIE CYUT 89
11.9. 式 CHAPTER 11.
2. nested for loop 語�1 for ( init; condition; increment ) {
for ( init; condition; increment ) {3 statement(s);
}5 statement(s);
}� �3. nested while loop 語
�while(condition) {
2 while(condition) {statement(s);
4 }statement(s);
6 }� �4. nested do...while loop 語
�do {
2 statement(s);do {
4 statement(s);} while( condition );
6}while( condition );� �
5. (prime)�1 [dywang@dyw219 zzz]$ vim nestedfor1.c
[dywang@dyw219 zzz]$ cat nestedfor1.c3 #include <stdio.h>
5 main() {int i, j, a;
7printf("Enter an integer: ");
9 scanf("%d", &a);
11 for ( i=2; i<a; i++) {for ( j=2; j<i/j; j++ )
13 if (!(i%j)) break; // if factor found, not primeif ( j > i/j ) printf("%d is prime\n", i);
15 }}
De-Yu Wang CSIE CYUT 90
11.10. CHAPTER 11.
� �6. �
[dywang@dyw219 zzz]$ gcc -o nestedfor1 nestedfor1.c� �7. �
1 [dywang@dyw219 zzz]$ ./nestedfor1Enter an integer: 10
3 2 is prime3 is prime
5 7 is prime[dywang@dyw219 zzz]$ ./nestedfor1
7 Enter an integer: 1002 is prime
9 3 is prime7 is prime
11 13 is prime23 is prime
13 31 is prime43 is prime
15 47 is prime59 is prime
17 61 is prime73 is prime
19 79 is prime97 is prime� �
11.10
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 loop1.c scanf a b fora b a=3, b=6 3+4+5+6=18
loop1
i. a>b a, bii. a<=0 ( a ) 1
De-Yu Wang CSIE CYUT 91
11.10. CHAPTER 11.
iii. b<=0 ( b ) b>=20 1 20
(b) 程式 loop2.c scanf a while 1 awhile 20 a
a=5 1+3+5=9loop2
(c) loop2.c 程式 loop3.c while do...while0 32 2 a
a=8 2+4+6+8=20loop3
(d) loop3.c 程式 loop4.c do...while( ) ( return)
式 3loop4
(e) 程式 loop5.c 7.4 stdio3.cEnter loop5
(f) 程式 loop6.c scanf a for continuea 100 5 if a 5
continue a=89 90+95+100=285loop6
(g) loop6.c程式 loop7.c for break 500loop7�
Enter an integer: 342 35+40+45+50+55+60+65+70+75+80=575� �
(h) 程式 loop8.c scanf 3 8 式loop8 4�
00010002 0022200
03333304 4444444� �
De-Yu Wang CSIE CYUT 92
Chapter 12
main 式
12.1 言
1. C 程式 式 (function)
2. 式 程式
3. 式
4. C 程式 式 main() 程式 程式 main 式
5. main 式�main(){
2 .....}
4void main( void ) {
6 ....}� �
6. main 式 main 程式
12.2
1. 程式
2. argc argv[]
3. argv[0] 程式argv[0] ./mainfun1�
1 [dywang@dyw219 zzz]$ vim mainfun1.c[dywang@dyw219 zzz]$ cat mainfun1.c
3 #include <stdio.h>
93
12.3. CHAPTER 12. MAIN 式
5 main( int argc, char *argv[] ) {int i, sum=0;
7for ( i=1; i<argc-1; i++) {
9 printf("%s+", argv[i]);sum += atoi(argv[i]);
11 }sum += atoi(argv[i]);
13 printf("%s=%d\n", argv[i], sum);}� �
4. �[dywang@dyw219 zzz]$ gcc -o mainfun1 mainfun1.c� �
5. �1 [dywang@dyw219 zzz]$ ./mainfun1 9 4 2 4
9+4+2+4=193 [dywang@dyw219 zzz]$ ./mainfun1 19 14 12 14
19+14+12+14=595 [dywang@dyw219 zzz]$ ./mainfun1 9 4 2 4 9 23
9+4+2+4+9+23=51� �
12.3
1. 式 main 程式 程式 Linux$? 0 程式 0�
[dywang@dyw219 zzz]$ ls mainfunc1.c2 mainfunc1.c
[dywang@dyw219 zzz]$ echo $?4 0
[dywang@dyw219 zzz]$ ls mainfunc1.cc6 ls: cannot access mainfunc1.cc: No such file or directory
[dywang@dyw219 zzz]$ echo $?8 2� �
2. 程式 程式 1�[dywang@dyw219 zzz]$ vim mainfun2.c
De-Yu Wang CSIE CYUT 94
12.4. ERRNO CHAPTER 12. MAIN 式
2 [dywang@dyw219 zzz]$ cat mainfun2.c#include <stdio.h>
4int main( int argc, char *argv[] ) {
6 int i, sum=0, tmp;
8 for ( i=1; i<argc-1; i++) {tmp = atoi(argv[i]);
10 if (tmp == 0) {printf("%s NOT a number!\n", argv[i]);
12 return 1;}
14 printf("%s+", argv[i]);sum += atoi(argv[i]);
16 }sum += atoi(argv[i]);
18 printf("%s=%d\n", argv[i], sum);return 0;
20 }� �3. �
[dywang@dyw219 zzz]$ gcc -o mainfun2 mainfun2.c� �4. 0�
1 [dywang@dyw219 zzz]$ ./mainfun2 1 2 3 41+2+3+4=10
3 [dywang@dyw219 zzz]$ echo $?0� �
5. abc 程式 1�[dywang@dyw219 zzz]$ ./mainfun2 1 2 abc
2 1+2+abc NOT a number!� �
12.4 errno
1. C 語言 式 include errno.h errno
2. errno 0 man 3 error
De-Yu Wang CSIE CYUT 95
12.4. ERRNO CHAPTER 12. MAIN 式
�[dywang@dyw219 zzz]$ man 3 errno | col -b | grep -E '^\s+E(PERM|NOENT|
ACCES)'2 EACCES Permission denied (POSIX.1)
ENOENT No such file or directory (POSIX.1)4 EPERM Operation not permitted (POSIX.1)� �
3. rename�[dywang@dyw219 zzz]$ vim mainfun3.c
2 [dywang@dyw219 zzz]$ cat mainfun3.c#include <stdio.h>
4 #include <errno.h>
6 int main( int argc, char *argv[] ) {int result;
8if(argc < 2) {
10 printf("Require TWO arguments\n" );return(1);
12 }result = rename( argv[1], argv[2] );
14 if( result != 0 ) {printf("File renaming error ");
16 switch(errno) {case EPERM:
18 printf("%d: Operation not permitted\n", errno);break;
20 case ENOENT:printf("%d: File not found\n", errno);
22 break;case EACCES:
24 printf("%d: Permission denied\n", errno);break;
26 default:printf("%d: Unknown error\n", errno);
28 }return(2);
30 }printf("%d: %s renamed to %s\n", errno, argv[1], argv[2]);
32return(0);
34 }� �4. �
[dywang@dyw219 zzz]$ gcc -o mainfun3 mainfun3.c� �5. a b 2 a
De-Yu Wang CSIE CYUT 96
12.5. STDOUT STDERR CHAPTER 12. MAIN 式
�1 [dywang@dyw219 zzz]$ ./mainfun3 a b
File renaming error 2: File not found� �6. touch a a a b 0�
[dywang@dyw219 zzz]$ touch a2 [dywang@dyw219 zzz]$ ./mainfun3 a b
0: a renamed to b� �7. b /root a /root 13�
1 [dywang@dyw219 zzz]$ ./mainfun3 b /root/aFile renaming error 13: Permission denied� �
8. /sbin/blkid a 18�[dywang@dyw219 zzz]$ ./mainfun3 /sbin/blkid a
2 File renaming error 18: Unknown error� �
12.5 STDOUT STDERR
1.STDOUT ( ) (STDERR) 式
(a) (stdout) 1 > >>(b) (stderr) 2 2> 2>>
>, 1>>>, 1>>
command 2>2>>
2. mainfun3 printf stdoutstdout /dev/null stderr /dev/null 程式�
[dywang@dyw219 zzz]$ ./mainfun3 /sbin/blkid a2 File renaming error 18: Unknown error
[dywang@dyw219 zzz]$ ./mainfun3 /sbin/blkid a > /dev/null4 [dywang@dyw219 zzz]$ ./mainfun3 /sbin/blkid a 2> /dev/null
De-Yu Wang CSIE CYUT 97
12.5. STDOUT STDERR CHAPTER 12. MAIN 式
File renaming error 18: Unknown error� �3. 式 printf fprintf stderr�
1 [dywang@dyw219 zzz]$ vim mainfun4.c[dywang@dyw219 zzz]$ cat mainfun4.c
3 #include <stdio.h>#include <errno.h>
5int main( int argc, char *argv[] ) {
7 int result;
9 if(argc < 2) {printf("Require TWO arguments\n" );
11 return(1);}
13 result = rename( argv[1], argv[2] );if( result != 0 ) {
15 fprintf(stderr,"File renaming error ");switch(errno) {
17 case EPERM:fprintf(stderr, "%d: Operation not permitted\n", errno);
19 break;case ENOENT:
21 fprintf(stderr, "%d: File not found\n", errno);break;
23 case EACCES:fprintf(stderr, "%d: Permission denied\n", errno);
25 break;default:
27 fprintf(stderr, "%d: Unknown error\n", errno);}
29 return(2);}
31 printf("%d: %s renamed to %s\n", errno, argv[1], argv[2]);
33 return(0);}� �
4. �[dywang@dyw219 zzz]$ gcc -o mainfun4 mainfun4.c� �
5. stderr /dev/null 18stderr�
1 [dywang@dyw219 zzz]$ ./mainfun4 /sbin/blkid a > /dev/nullFile renaming error 18: Unknown error
De-Yu Wang CSIE CYUT 98
12.6. 式 PERROR CHAPTER 12. MAIN 式
3 [dywang@dyw219 zzz]$ ./mainfun4 /sbin/blkid a 2> /dev/null� �
12.6 式 perror
1. mainfunc3 mainfun4 程式 errno 0式 perror()
errno perrorSTDERR
2. mainfun5.c 程式 mainfun3.c 程式�1 [dywang@dyw219 zzz]$ vim mainfun5.c
[dywang@dyw219 zzz]$ cat mainfun5.c3 #include <stdio.h>
#include <errno.h>5
int main( int argc, char *argv[] ) {7 int result;
9 if(argc < 2) {printf("Require TWO arguments\n" );
11 return(1);}
13 result = rename( argv[1], argv[2] );if( result != 0 ) {
15 perror("");return(errno);
17 }printf("%d: %s renamed to %s\n", errno, argv[1], argv[2]);
19return(errno);
21 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o mainfun5 mainfun5.c� �4. a b 2�
1 [dywang@dyw219 zzz]$ ./mainfun5 a bNo such file or directory
3 [dywang@dyw219 zzz]$ echo $?2� �
De-Yu Wang CSIE CYUT 99
12.7. CHAPTER 12. MAIN 式
5. touch a a a b 0�[dywang@dyw219 zzz]$ touch a
2 [dywang@dyw219 zzz]$ ./mainfun5 a b0: a renamed to b
4 [dywang@dyw219 zzz]$ echo $?0� �
6. b /root a /root 13�1 [dywang@dyw219 zzz]$ ./mainfun5 b /root/a
Permission denied3 [dywang@dyw219 zzz]$ echo $?
13� �7. /sbin/blkid a 18�
[dywang@dyw219 zzz]$ ./mainfun5 /sbin/blkid a2 Invalid cross-device link
[dywang@dyw219 zzz]$ echo $?4 18� �
12.7
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 mfun1.c mfun13�
./mfun1 100 -22 332 111/3=37.000
./mfun1 100 -22 33 104 121/4=30.250� �
De-Yu Wang CSIE CYUT 100
12.7. CHAPTER 12. MAIN 式
(b) 程式 mfun2.c a b a>bERROR 0 a<b CORRECT
0 程式mfun2�
./mfun2 2 32 CORRECT
echo $?4 0
./mfun2 10 26 ERROR
echo $?8 1� �
(c) mainfun3.c 2 程式mfun3.cmfun3�
./mfun3 a b2 File renaming error File not found
echo $?4 2
6 ./mfun3 b /root/bFile renaming error Permission denied
8 echo $?13� �
(d) mainfun4.c 2 程式 mfun4.cstderr
mfun4�1 ./mfun4 a b >/dev/null
File renaming error File not found3 echo $?
25 ./mfun4 b /root/b >/dev/null
File renaming error Permission denied7 echo $?
139 ./mfun4 /sbin/blkid b >/dev/null
File renaming error Unknown error11 echo $?
1813 ./mfun4 b a 2>/dev/null
0: b renamed to a15 echo $?
0� �
De-Yu Wang CSIE CYUT 101
12.7. CHAPTER 12. MAIN 式
(e) 程式 mfun5.c access式 (F_OK) (R_OK) (W_OK)(X_OK) perror 式 程式 errno
mfun5 access 式�#include <unistd.h>
2 int access(const char *pathname, int mode);
4 mode: F_OK R_OK W_OK X_OK� �
�./mfun5 a >/dev/null
2 F_OK: No such file or directoryecho $?
4 2touch a
6 ./mfun5 a >/dev/nullX_OK: Permission denied
8 echo $?13
10 chmod 777 a./mfun5 a 2>/dev/null
12 a OKecho $?
14 0� �
De-Yu Wang CSIE CYUT 102
Chapter 13
式
13.1 言
1. C 程式 式 (function)
2. 式 程式
3. 式 式 式
13.2
1. 式語�return_type function_name( parameter list ) {
2 body of the function}� �
2. 式 max 式 num1, num2
�1 int max(int num1, int num2) {
int result;3
if (num1 > num2)5 result = num1;
else7 result = num2;
9 return result;}� �
103
13.3. CHAPTER 13. 式
13.3
1. 式 程式語�
return_type function_name( parameter list );� �2. �
1 int max(int num1, int num2);int max(int, int);� �
3. �[dywang@dyw219 zzz]$ vim function1.c
2 [dywang@dyw219 zzz]$ cat function1.c#include <stdio.h>
4int max(int num1, int num2) {
6 int result;
8 if (num1 > num2) result = num1;else result = num2;
10 return result;}
12main() {
14 int a, b;
16 printf("Enter TWO integers: ");scanf("%d %d", &a, &b);
18printf("a = %d, b = %d, max = %d\n", a, b, max(a,b));
20 }� �4. �
[dywang@dyw219 zzz]$ gcc -o function1 function1.c� �5. �
1 [dywang@dyw219 zzz]$ ./function1Enter TWO integers: 10 20
3 a = 10, b = 20, max = 20[dywang@dyw219 zzz]$ ./function1
De-Yu Wang CSIE CYUT 104
13.4. CALL BY VALUE CHAPTER 13. 式
5 Enter TWO integers: 21 11a = 21, b = 11, max = 21� �
13.4 call by value
1. call by value 式 式
2. �[dywang@dyw219 zzz]$ cat function2.c
2 #include <stdio.h>
4 void swap(int x, int y) {int temp;
6temp = x;
8 x = y;y = temp;
10 return;}
12main() {
14 int a, b;
16 printf("Enter TWO integers: ");scanf("%d %d", &a, &b);
18printf("Before swap, a = %d, b = %d\n", a, b);
20 swap(a, b);printf("After swap, a = %d, b = %d\n", a, b);
22 }� �3. �
[dywang@dyw219 zzz]$ gcc -o function2 function2.c� �4. a b�
1 [dywang@dyw219 zzz]$ ./function2Enter TWO integers: 10 20
3 Before swap, a = 10, b = 20After swap, a = 10, b = 20� �
De-Yu Wang CSIE CYUT 105
13.5. CALL BY REFERENCE CHAPTER 13. 式
13.5 call by reference
1. call by reference 式 式 式式
2. &a, &b (& ) 式 *x, *y ( * )�
[dywang@dyw219 zzz]$ vim function3.c2 [dywang@dyw219 zzz]$ cat function3.c
#include <stdio.h>4
void swap(int *x, int *y) {6 int temp;
8 temp = *x;*x = *y;
10 *y = temp;return;
12 }
14 main() {int a, b;
16printf("Enter TWO integers: ");
18 scanf("%d %d", &a, &b);
20 printf("Before swap, a = %d, b = %d\n", a, b);swap(&a, &b);
22 printf("After swap, a = %d, b = %d\n", a, b);}� �
3. �1 [dywang@dyw219 zzz]$ gcc -o function3 function3.c� �
4. 式 a b�1 [dywang@dyw219 zzz]$ ./function3
Enter TWO integers: 10 203 Before swap, a = 10, b = 20
After swap, a = 20, b = 105 [dywang@dyw219 zzz]$ ./function3
Enter TWO integers: 21 117 Before swap, a = 21, b = 11
After swap, a = 11, b = 21� �
De-Yu Wang CSIE CYUT 106
13.6. * CHAPTER 13. 式
13.6 *
1. 式 式�int func(int, ... ) {
2 ....}
4int main() {
6 func(1, 2, 3);func(1, 2, 3, 4);
8 }� �2.
(a) include stdarg.h
(b) 式 式 , int...
(c) va_list type 式
(d) 式 int va_start va_list(e) va_arg va_list 式
(f) va_end va_list
3. average 式�[dywang@dyw219 zzz]$ vim function5.c
2 [dywang@dyw219 zzz]$ cat function5.c#include <stdio.h>
4 #include <stdarg.h>
6 float average(int num,...) {va_list valist;
8 float sum = 0.0;int i;
10va_start(valist, num);
12 for (i = 0; i < num; i++) {sum += va_arg(valist, int);
14 }va_end(valist);
16return sum/num;
18 }
20 main() {printf("average(2,3,4)=%5.2f\n", average(2,3,4));
22 printf("average(3,3,4,5)=%5.2f\n", average(3,3,4,5));printf("average(4,3,4,12,9)=%5.2f\n", average(4,3,4,12,9));
24 printf("average(5,3,4,65,11,39)=%5.2f\n", average(5,3,4,65,11,39));}
De-Yu Wang CSIE CYUT 107
13.7. CHAPTER 13. 式
� �4. �
1 [dywang@dyw219 zzz]$ gcc -o function5 function5.c� �5. 式 average�
1 [dywang@dyw219 zzz]$ ./function5average(2,3,4)= 3.50
3 average(3,3,4,5)= 4.00average(4,3,4,12,9)= 7.00
5 average(5,3,4,65,11,39)=24.40� �
13.7
1.
(a) (local variable) 式 式
(b) (global variable) 式 式
(c) (static variable)式
2. 式 式
3. 程式 function2.c�1 [dywang@dyw219 zzz]$ vim function6.c
[dywang@dyw219 zzz]$ cat function6.c3 #include <stdio.h>
5 int x, y;
7 void swap(void) {int temp;
9temp = x;
11 x = y;y = temp;
13 return;}
15main() {
17 printf("Enter TWO integers: ");
De-Yu Wang CSIE CYUT 108
13.7. CHAPTER 13. 式
scanf("%d %d", &x, &y);19
printf("Before swap, x = %d, y = %d\n", x, y);21 swap();
printf("After swap, x = %d, y = %d\n", x, y);23 }� �
4. �1 [dywang@dyw219 zzz]$ gcc -o function6 function6.c� �
5. 式 average�1 [dywang@dyw219 zzz]$ ./function6
Enter TWO integers: 12 563 Before swap, x = 12, y = 56
After swap, x = 56, y = 12� �6. 式 increament 1�
[dywang@dyw219 zzz]$ vim function7.c2 [dywang@dyw219 zzz]$ cat function7.c
#include <stdio.h>4
int increament(void) {6 static int i=0;
8 return i++;}
10main() {
12 printf("i = %d\n", increament());printf("i = %d\n", increament());
14 printf("i = %d\n", increament());printf("i = %d\n", increament());
16 }� �7. �
[dywang@dyw219 zzz]$ gcc -o function7 function7.c� �8.
De-Yu Wang CSIE CYUT 109
13.8. CHAPTER 13. 式
�1 [dywang@dyw219 zzz]$ ./function7
i = 03 i = 1
i = 25 i = 3� �
13.8
1. 式�1 void recursion() {
recursion();3 }
5 int main(){recursion();
7 }� �2. �
1 [dywang@dyw219 zzz]$ vim function8.c[dywang@dyw219 zzz]$ cat function8.c
3 #include <stdio.h>
5 int factorial(unsigned int i) {if(i <= 1) return 1;
7return i * factorial(i-1);
9 }int main() {
11 int i = 15;printf("Factorial of %d is %d\n", i, factorial(i));
13 return 0;}� �
3. �[dywang@dyw219 zzz]$ gcc -o function8 function8.c� �
4. �1 [dywang@dyw219 zzz]$ ./function8
Factorial of 15 is 2004310016
De-Yu Wang CSIE CYUT 110
13.9. CHAPTER 13. 式
� �
13.9
1.
(a) zzz
(b) zzz
(c)
(d) main 式 0
2. C 語言程式
(a) 程式 func1.c scanf a b
i. a>b a, bii. a<=0 ( a ) 1iii. b<=0 ( b ) b>=20 20
sum 式 a b a bfunc1�
[dywang@dywmsi zzz]$ ./func12 Enter TWO integers: 6 12
6+...+12=634 [dywang@dywmsi zzz]$ ./func1
Enter TWO integers: 12 56 5+...+12=68
[dywang@dywmsi zzz]$ ./func18 Enter TWO integers: -3 45
1+...+20=21010 [dywang@dywmsi zzz]$ ./func1
Enter TWO integers: -2 -912 1+...+20=210
[dywang@dywmsi zzz]$ echo $?14 0� �
(b) func1.c 程式 func2.c 式 swap a, bswap a>b swap void func2
(c) 程式 func3.c 程式 ( )( ) 0 999999
3 ./func3 1 2 3 4 (2+4)/(1+3)=1.500func3 式 strlen, strcat,
strcpy 式
De-Yu Wang CSIE CYUT 111
13.9. CHAPTER 13. 式
(d) 程式 func4.c 式 sum式 sum tyep int 2, 3, 4
0 func43�
./func4 1002 0/1=0.000
./func4 100 -22 334 111/3=27.750
./func4 100 -22 33 106 121/4=24.200
./func4 100 -22 33 10 208 0/5=0.000� �
(e) func4.c 程式 func5.c 式 sum voidtotal ( 0) func5
3. function8.c 式 程式 func6.c func6num num
stderr 0factorial 式 type
unsigned long unsigned long 20num>20 20 -(1) 1'-' B(2) 2 B�./func6 -3 > /dev/null
2 -(1), Not a Number!./func6 2B3 > /dev/null
4 B(2), Not a Number!./func6 6
6 Factorial of 6 is 720./func6 20
8 Factorial of 20 is 2432902008176640000./func6 30
10 Factorial of 20 is 2432902008176640000� �
De-Yu Wang CSIE CYUT 112
Chapter 14
14.1
1.
..
numbers[0]
.
numbers[1]
.
numbers[2]
.
numbers[3]
.
...
. Last Element.First Element
2. �type arrayName [ arraySize ];� �
3. �1 double balance[10];� �
4. �1 double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};� �
5. �1 double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};� �
6.
..
1000.0
.
balance
.
2.0
.
3.4
.
17.0
.
50.0
.
0
.
1
.
2
.
3
.
4
113
14.2. CHAPTER 14.
7. �1 [dywang@dyw219 zzz]$ vim array1.c
[dywang@dyw219 zzz]$ cat array1.c3 #include <stdio.h>
5 main() {int i, x, a[7];
7printf("Enter an integer: ");
9 scanf("%d", &x);for ( i=0; i<7; i++) {
11 a[i] = i + x;printf("a[%d] = %d\n", i, a[i]);
13 }}� �
8. �[dywang@dyw219 zzz]$ gcc -o array1 array1.c� �
9. �1 [dywang@dyw219 zzz]$ ./array1
Enter an integer: 53 a[0] = 5
a[1] = 65 a[2] = 7
a[3] = 87 a[4] = 9
a[5] = 109 a[6] = 11� �
14.2
1. �1 type name[size1][size2]...[sizeN];� �
2. �1 type arrayName [ x ][ y ];� �
De-Yu Wang CSIE CYUT 114
14.2. CHAPTER 14.
3. 3x5
..
a[0][0]
.
a[0][1]
.
a[0][2]
.
a[0][3]
.
a[0][4]
.
a[1][0]
.
a[1][1]
.
a[1][2]
.
a[1][3]
.
a[1][4]
.
a[2][0]
.
a[2][1]
.
a[2][2]
.
a[2][3]
.
a[2][4]
.
Column 0
.
Column 1
.
Column 2
.
Column 3
.
Column 4
.
Row 0
.
Row 1
.
Row 2
4. 3x4 3�1 int a[3][4]={{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};� �
5. �1 [dywang@dyw219 zzz]$ vim array2.c
[dywang@dyw219 zzz]$ cat array2.c3 #include <stdio.h>
5 main() {int a[][4]={{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
7 int i, j;
9 for ( i=0; i<3; i++ ) {for ( j=0; j<4; j++ ) {
11 printf("a[%d][%d] = %d\n", i,j, a[i][j] );}
13 }}� �
6. �[dywang@dyw219 zzz]$ gcc -o array2 array2.c� �
7. �1 [dywang@dyw219 zzz]$ ./array2
a[0][0] = 03 a[0][1] = 1
a[0][2] = 25 a[0][3] = 3
a[1][0] = 47 a[1][1] = 5
a[1][2] = 69 a[1][3] = 7
a[2][0] = 811 a[2][1] = 9
a[2][2] = 10
De-Yu Wang CSIE CYUT 115
14.3. - CHAPTER 14.
13 a[2][3] = 11� �
14.3 -
1. null�1 char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};� �
2. 式�1 char str[] = "Hello";� �
3. �1 [dywang@dyw219 zzz]$ cat array3.c
#include <stdio.h>3
main () {5 char str1[6]={'H', 'e', 'l', 'l', 'o', '\0'};
char str2[]="Hello";7
printf("string1: %s\n", str1 );9 printf("string2: %s\n", str2 );
}� �4. �
[dywang@dyw219 zzz]$ gcc -o array3 array3.c� �5. �
1 [dywang@dyw219 zzz]$ ./array3string1: Hello
3 string2: Hello� �
De-Yu Wang CSIE CYUT 116
14.4. 式 CHAPTER 14.
14.4 式
1. 式
(a) strcpy(s1, s2): s2 s1
(b) strcat(s1, s2): s2 s1
(c) strlen(s1): s1
(d) strcmp(s1, s2): s1 s2 s1 s20 s1<s2 0 s1>s2 0
(e) strchr(s1, ch): s1 ch
(f) strstr(s1, s2): s2 s1
2. �1 [dywang@dyw219 zzz]$ vim array4.c
[dywang@dyw219 zzz]$ cat array4.c3 #include <stdio.h>
#include <string.h>5
main () {7 char str1[11]="Hello", str2[11], str3[11];
9 printf("Enter a string: ");scanf("%s", str2);
11printf("str1 = %s\n", str1 );
13 printf("str2 = %s\n", str2 );strcpy(str3,str1);
15 printf("strcmp(str1,str3) = %d\n", strcmp(str1,str3) );printf("strcpy(str3,str1), str3 = %s\n", str3 );
17 printf("strcat(str3,str2) = %s\n", strcat(str3,str2) );printf("str3 = %s\n", str3 );
19 printf("strlen(str2) = %d\n", strlen(str2) );printf("strcmp(str1,str2) = %d\n", strcmp(str1,str2) );
21 printf("strchr(str1, 'e') = %d\n", strchr(str1, 'e') );printf("strstr(str1, str2) = %d\n", strstr(str1, str2) );
23 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o array4 array4.c� �4. str="- ABC" strlen(str2) str2 4 str-
cmp(str1,str2) 27 str2 str1 (ASCII ) strstr(str1,str2)0 str1 str2
De-Yu Wang CSIE CYUT 117
14.5. 式 CHAPTER 14.
�1 [dywang@dyw219 zzz]$ ./array4
Enter a string: -ABC3 str1 = Hello
str2 = -ABC5 strcpy(str3,str1), str3 = Hello
strcmp(str1,str3) = 07 strcat(str3,str2) = Hello-ABC
str3 = Hello-ABC9 strlen(str2) = 4
strcmp(str1,str2) = 2711 strchr(str1, 'e') = 1641270433
strstr(str1, str2) = 0� �5. str="Hello" strlen(str2) str2 5 str-
cmp(str1,str2) 0 str2 str1 (ASCII ) strstr(str1,str2)935582496 str1 H strchr(str1,'e') 935582497
H �[dywang@dyw219 zzz]$ ./array4
2 Enter a string: Hellostr1 = Hello
4 str2 = Hellostrcpy(str3,str1), str3 = Hello
6 strcmp(str1,str3) = 0strcat(str3,str2) = HelloHello
8 str3 = HelloHellostrlen(str2) = 5
10 strcmp(str1,str2) = 0strchr(str1, 'e') = 935582497
12 strstr(str1, str2) = 935582496� �
14.5 式
1. call by reference 式 式式 式
(a) �void myFunction(int *param) {
2 ....}� �
(b) �1 void myFunction(int param[10]) {
De-Yu Wang CSIE CYUT 118
14.5. 式 CHAPTER 14.
....3 }� �
(c) �1 void myFunction(int param[]) {
....3 }� �
2. size�1 [dywang@dyw219 zzz]$ vim array5.c
[dywang@dyw219 zzz]$ cat array5.c3 #include <stdio.h>
#include <stdarg.h>5
float average(int num[], int size) {7 float sum = 0.0;
int i;9 for ( i=0; i<size; i++) {
sum += num[i];11 }
13 return sum/size;}
15main() {
17 int num[]={5, 3, 4, 65, 11, 39};
19 printf("average(5,3,4,65,11,39)=%5.2f\n", average(num, 6));}� �
3. �[dywang@dyw219 zzz]$ gcc -o array5 array5.c� �
4. �1 [dywang@dyw219 zzz]$ ./array5
average(5,3,4,65,11,39)=21.17� �
De-Yu Wang CSIE CYUT 119
14.6. CHAPTER 14.
14.6
1.
(a) zzz
(b) zzz
(c) array.txt
(d) array.txt
(e)
2. array.txt C 語言程式
(a) 程式 arr1.c int arr1[] sizeof arr1 A scanfnum num 2 2 10
10 arr1 index ( 0 A-1) num index numB 式 A=X<TAB>B=Y
arr1�./arr1
2 Enter an integer: -2A=49 B=1328
4 ./arr1Enter an integer: 4
6 A=49 B=14026./arr1
8 Enter an integer: 13A=49 B=23854� �
(b) 程式 arr2.c int arr2[][4] arr2[] A, B, C, D 4( char x) A, B, C, D
Only A B C D 程式 程式�1 if(x<65 || x>68 ) {
printf......;3 return 1;
}� �arr2 A, B, C, D
65 index 0, 1, 2, 3 if...else switch A,B,C,D0,1,2,3�
sum+=arr2[i][x-65];� �
De-Yu Wang CSIE CYUT 120
14.6. CHAPTER 14.
�1 ./arr2
Enter a char: A3 A : 3267
./arr25 Enter a char: E
Only A B C D� �(c) 程式 arr3.c 10 str1 str2
10 程式 strcmp 式strcat 式 str1 str2
arr3�./arr3
2 String 1: 12345String 2: abcde
4 strcat=abcde12345./arr3
6 String 1: abcdeString 2: 12345
8 strcat=abcde12345./arr3
10 String 1: 12345qwertasdfgstrlen(12345qwertasdfg) = 15 > 10
12 ./arr3String 1: 12345
14 String 2: 12345strcat=12345
16 ./arr3String 1: 12345
18 String 2: qweasdzxcvbnstrlen(qweasdzxcvbn) = 12 > 10� �
(d) 程式 arr4.c 21 str121 程式
"Just a TEST!" "jUSTA test!" arr4 式toupper(char), tolower(char)�1 ./arr4
String 1: "Just a Test!"3 str1="Just a Test!", str2="jUST A tEST!"� �
(e) arr4.c 程式 arr5.c 式 void transform(char*str1, char *str2) str1 str2
arr5 arr4
De-Yu Wang CSIE CYUT 121
Chapter 15
15.1
1.&�
1 int var1;char var2[10];
3printf("Address of var1 variable: %x\n", &var1 );
5 printf("Address of var2 variable: %x\n", &var2 );� �2. (pointer) (type)
*
�1 type *var-name;� �
3. �1 int *ip;
double *dp;3 float *fp;
char *ch� �4. �
[dywang@dyw219 zzz]$ vim pointer1.c2 [dywang@dyw219 zzz]$ cat pointer1.c
#include <stdio.h>4
main () {6 int var=11;
122
15.2. CHAPTER 15.
int *p;8
p = &var;10 printf( "var = %d\n", var );
printf( "&var = %x\n", &var );12 printf( "p = %x\n", p );
printf( "*p = %d\n", *p );14 }� �
5. �[dywang@dyw219 zzz]$ gcc -o pointer1 pointer1.c� �
6. �1 [dywang@dyw219 zzz]$ ./pointer1
var = 113 &var = 2a378bf4
p = 2a378bf45 *p = 11� �
15.2
1. (Null) 0 0�1 [dywang@dyw219 zzz]$ vim pointer2.c
[dywang@dyw219 zzz]$ cat pointer2.c3 #include <stdio.h>
5 main () {int *p=NULL;
7printf( "p = %x\n", p );
9 }� �2. �
1 [dywang@dyw219 zzz]$ gcc -o pointer2 pointer2.c� �3.
De-Yu Wang CSIE CYUT 123
15.3. CHAPTER 15.
�1 [dywang@dyw219 zzz]$ ./pointer2
p = 0� �
15.3
1. ++, --, +, -�int *ptr, *p;
2 ptr++;ptr--;
4 p = ptr-1;p = ptr+1;� �
2. �1 [dywang@dyw219 zzz]$ vim pointer3.c
[dywang@dyw219 zzz]$ cat pointer3.c3 #include <stdio.h>
5 main () {int var[]={11, 22, 33, 44};
7 int i, *ptr;
9 ptr=var;for ( i=0; i<sizeof(var)/sizeof(int); i++, ptr++) {
11 printf( "var[%d]=%d\t&var[%d]=%x\n", i, var[i], i, &var[i]);printf( "*ptr=%d\t\tptr=%x\n", *ptr, ptr);
13 }}� �
3. �[dywang@dyw219 zzz]$ gcc -o pointer3 pointer3.c� �
4. �1 [dywang@dyw219 zzz]$ ./pointer3
[dywang@dyw219 zzz]$ ./pointer33 var[0]=11 &var[0]=e55f9d10
*ptr=11 ptr=e55f9d105 var[1]=22 &var[1]=e55f9d14
*ptr=22 ptr=e55f9d147 var[2]=33 &var[2]=e55f9d18
De-Yu Wang CSIE CYUT 124
15.4. CHAPTER 15.
*ptr=33 ptr=e55f9d189 var[3]=44 &var[3]=e55f9d1c
*ptr=44 ptr=e55f9d1c� �
15.4
1. ++, --, +, -�� �2. �
[dywang@dyw219 zzz]$ vim pointer4.c2 [dywang@dyw219 zzz]$ cat pointer4.c
#include <stdio.h>4
main () {6 int var[]={11, 22, 33, 44};
int i=0, *ptr;8
ptr=var;10 while ( ptr <= &var[sizeof(var)/sizeof(int)-1]) {
printf( "var[%d]=%d\t&var[%d]=%x\n", i, var[i], i, &var[i]);12 printf( "*ptr=%d\t\tptr=%x\n", *ptr, ptr);
ptr++;14 i++;
}16 }� �
3. �[dywang@dyw219 zzz]$ gcc -o pointer4 pointer4.c� �
4. �1 [dywang@dyw219 zzz]$ ./pointer4
var[0]=11 &var[0]=8f3b1ea03 *ptr=11 ptr=8f3b1ea0
var[1]=22 &var[1]=8f3b1ea45 *ptr=22 ptr=8f3b1ea4
var[2]=33 &var[2]=8f3b1ea87 *ptr=33 ptr=8f3b1ea8
var[3]=44 &var[3]=8f3b1eac9 *ptr=44 ptr=8f3b1eac� �
De-Yu Wang CSIE CYUT 125
15.5. CHAPTER 15.
15.5
1. �1 int *ptr[MAX];� �
2. �1 [dywang@dyw219 zzz]$ vim pointer5.c
[dywang@dyw219 zzz]$ cat pointer5.c3 #include <stdio.h>
5 main () {int var[]={11, 22, 33, 44};
7 int MAX=sizeof(var)/sizeof(int);int i, *ptr[MAX];
9for ( i=0; i<MAX; i++) {
11 ptr[i] = &var[i];printf( "*ptr[%d]=%d\t\tptr[%d]=%x\n", i, *ptr[i], i, ptr[i]);
13 }}� �
3. �[dywang@dyw219 zzz]$ gcc -o pointer5 pointer5.c� �
4. �1 [dywang@dyw219 zzz]$ ./pointer5
*ptr[0]=11 ptr[0]=8d1ef7803 *ptr[1]=22 ptr[1]=8d1ef784
*ptr[2]=33 ptr[2]=8d1ef7885 *ptr[3]=44 ptr[3]=8d1ef78c� �
5. �1 [dywang@dyw219 zzz]$ vim pointer6.c
[dywang@dyw219 zzz]$ cat pointer6.c3 #include <stdio.h>
5 main () {char *name[]={ "dywang", "linda", "peter", "rita" };
7 int MAX=sizeof(name)/sizeof(*name);int i;
De-Yu Wang CSIE CYUT 126
15.6. CHAPTER 15.
9for ( i=0; i<MAX; i++)
11 printf( "name[%d]=%s\n", i, name[i]);}� �
6. �[dywang@dyw219 zzz]$ gcc -o pointer6 pointer6.c� �
7. �1 [dywang@dyw219 zzz]$ ./pointer6
name[0]=dywang3 name[1]=linda
name[2]=peter5 name[3]=rita� �
15.6
1.(pointer to pointer)�1 int var;
int *ptr;3 int **pptr;� �
..address ofvar pointer
. varaddress
. var value.
**pptr
.
*ptr
.
var
2. �1 [dywang@dyw219 zzz]$ vim pointer7.c
[dywang@dyw219 zzz]$ cat pointer7.c3 #include <stdio.h>
5 main () {int var=1234;
7 int *ptr;int **pptr;
9ptr = &var;
11 pptr= &ptr;
De-Yu Wang CSIE CYUT 127
15.7. 式 CHAPTER 15.
13 printf( "var=%d\n*ptr=%d\n**pptr=%d\n", var, *ptr, **pptr);}� �
3. �[dywang@dyw219 zzz]$ gcc -o pointer7 pointer7.c� �
4. �1 [dywang@dyw219 zzz]$ ./pointer7
var=12343 *ptr=1234
**pptr=1234� �
15.7 式
1. unsigned long sec 式 getSeconds sec式 time 1970 1 1 0 0 0
Unix ( ) POSIX�[dywang@dyw219 zzz]$ vim pointer8.c
2 [dywang@dyw219 zzz]$ cat pointer8.c#include <stdio.h>
4 #include <time.h>
6 void getSeconds(unsigned long *par) {*par = time( NULL );
8 return;}
10main () {
12 unsigned long sec;
14 getSeconds( &sec );
16 printf("Number of seconds: %ld\n", sec );}� �
2. �1 [dywang@dyw219 zzz]$ gcc -o pointer8 pointer8.c� �
De-Yu Wang CSIE CYUT 128
15.8. 式 CHAPTER 15.
3. 1970 1 1 0 0 0�1 [dywang@dyw219 zzz]$ ./pointer8
Number of seconds: 1563269570� �4. date +%s�
[dywang@dyw219 zzz]$ date +%s2 1563269576� �
15.8 式
1. 式 式�[dywang@dyw219 zzz]$ vim pointer9.c
2 [dywang@dyw219 zzz]$ cat pointer9.c#include <stdio.h>
4float getAverage(int *arr, int size)
6 {int i, sum=0;
8 float avg;
10 for ( i=0; i<size; ++i) {sum += arr[i];
12 }avg = (float)sum/size;
14 return avg;}
16main () {
18 int balance[] = {1000, 2, 3, 17, 50};float avg;
20avg = getAverage( balance, 5 ) ;
22 printf("Average(1000, 2, 3, 17, 50) = %f\n", avg );}� �
2. �1 [dywang@dyw219 zzz]$ gcc -o pointer9 pointer9.c� �
3.
De-Yu Wang CSIE CYUT 129
15.9. 式 CHAPTER 15.
�1 [dywang@dyw219 zzz]$ ./pointer9
Average(1000, 2, 3, 17, 50) = 214.399994� �
15.9 式
1. C 語言 式式 式�
int * myFunction() {2 ....
}� �2. age[10]
10 arg&age[0] pointer p�1 int *p;
int age[10];3
p = age;� �3. getRandom 式 6 r r
�[dywang@dyw219 zzz]$ vim pointer10.c
2 [dywang@dyw219 zzz]$ cat pointer10.c#include <stdio.h>
4int * getRandom() {
6 static int r[6];int i;
8srand( (unsigned)time(NULL) );
10 for ( i=0; i<6; ++i ) {r[i] = rand();
12 printf( "r[%d] = %d\n", i, r[i]);}
14 return r;}
16main () {
18 int *p;int i;
20p = getRandom();
De-Yu Wang CSIE CYUT 130
15.10. CHAPTER 15.
22 for ( i=0; i<6; i++ ) {printf( "*(p+%d) : %d\n", i, *(p+i) );
24 }}� �
4. �1 [dywang@dyw219 zzz]$ gcc -o pointer10 pointer10.c� �
5. getRandom�1 [dywang@dyw219 zzz]$ ./pointer10
r[0] = 1261167173 r[1] = 1369586395
r[2] = 7943048075 r[3] = 586010293
r[4] = 2405856517 r[5] = 20839561
*(p+0) : 1261167179 *(p+1) : 1369586395
*(p+2) : 79430480711 *(p+3) : 586010293
*(p+4) : 24058565113 *(p+5) : 20839561� �
15.10
1.
(a) zzz
(b) zzz
(c) array.txt
(d)
2. array.txt C 語言程式
(a) 程式 point1.c int arr3[] ptr arr3 do...whilex arr3
ptr ptr+n <TAB>point1�
1 ./point1Enter an integer: -2
3 Enter an integer: 10000
De-Yu Wang CSIE CYUT 131
15.10. CHAPTER 15.
Enter an integer: 195 ptr=-767412528 *ptr=186 ptr+19=-767412452 *(ptr+19)=503� �
(b) 程式 point2.c int arr8[] ptr arr8 do...whilex arr3
for x'-' ptr
point2�1 ./point2
Enter an integer: -23 Enter an integer: 19
Enter an integer: 35 String:-2--N--I--i--E-� �
(c) 程式 point3.c arr11 *name do...whilex *name
for 1 x":" point3�
1 ./point3Enter an integer: -3
3 Enter an integer: 10Enter an integer: 3
5 Name:ALLEN:COLIN:DAVID� �(d) 程式 point4.c x ptr x
pptr ptr<TAB> point4
�1 ./point4
Enter an integer: 123 x=12 *ptr=12 **pptr=12� �
(e) 程式 point5.c int arr4[] do...while xarr4 式 ovdiff
-x x ovdiff <TAB>point5�
1 ./point5Enter an integer: -2
3 Enter an integer: 123Enter an integer: 10
De-Yu Wang CSIE CYUT 132
15.10. CHAPTER 15.
5 x=10 ovdiff=4396� �(f) 程式 point6.c x x>5 5 式 getSec
x x Unix secs ( static) secs程式 main secs point6
x=3�1 ./point6
Enter an integer: 93 sec0=1564977690
sec1=15649776905 sec2=1564977690
sec3=15649776907 sec4=1564977690
./point69 Enter an integer: 3
sec0=156497769511 sec1=1564977695
sec2=1564977695� �
De-Yu Wang CSIE CYUT 133
Chapter 16
16.1 式
1. 程式 程式
式void *calloc(int num, int size);num size bytesvoid free(void *address); addressvoid *malloc(int num); num
sizevoid *realloc(void *address, int newsize); newsize
16.2
1. char malloc 式
�[dywang@dyw219 zzz]$ vim malloc1.c
2 [dywang@dyw219 zzz]$ cat malloc1.c#include <stdio.h>
4 #include <stdlib.h>#include <string.h>
6int main() {
8 char name[20];char *description;
10strcpy(name, "De-Yu Wang");
12description = malloc( 10 * sizeof(char) );
14 if( description == NULL ) {fprintf(stderr, "Error - unable to allocate required memory\n");
16 return 1;} else {
18 strcpy( description, "CSIE CYUT");}
20 printf("Name: %s\n", name );
134
16.3. CHAPTER 16.
printf("Description: %s\n", description );22 return 0;
}� �2. �
1 [dywang@dyw219 zzz]$ gcc -o malloc1 malloc1.c� �3. �
1 [dywang@dyw219 zzz]$ ./malloc1Name: De-Yu Wang
3 Description: CSIE CYUT� �
16.3
1. 式 realloc() 式 free()�1 [dywang@dyw219 zzz]$ vim malloc2.c
[dywang@dyw219 zzz]$ cat malloc2.c3 #include <stdio.h>
#include <stdlib.h>5 #include <string.h>
7 int main() {char name[20];
9 char *description;
11 strcpy(name, "De-Yu Wang");
13 description = malloc( 10 * sizeof(char) );if( description == NULL ) {
15 fprintf(stderr, "Error - unable to allocate required memory\n");return 1;
17 } else {strcpy( description, "CSIE CYUT");
19 }description = malloc( 100 * sizeof(char) );
21 if( description == NULL ) {fprintf(stderr, "Error - unable to allocate required memory\n");
23 return 1;} else {
25 strcpy( description, "ChaoYang University of Technology");}
27 printf("Name = %s\n", name );printf("Description: %s\n", description );
De-Yu Wang CSIE CYUT 135
16.4. CHAPTER 16.
29 free(description);
31 return 0;}� �
2. �[dywang@dyw219 zzz]$ gcc -o malloc2 malloc2.c� �
3. �1 [dywang@dyw219 zzz]$ ./malloc2
Name = De-Yu Wang3 Description: ChaoYang University of Technology� �
16.4
1.
(a) zzz(b) zzz(c)
2. C 語言程式
(a) 程式 mem1a.c name desc char程式
mema1�1 ./mema1 "De-Yu Wang" "CSIE CYUT"
Name: De-Yu Wang3 Desc: CSIE CYUT� �
(b) mema1.c 程式 mem2a.c for ( )程式
mema1�1 ./mema2 "Wang" "CSIE" "De-Yu Wang" "CSIE CYUT"
Name: Wang3 Desc: CSIE
Name: De-Yu Wang5 Desc: CSIE CYUT� �
De-Yu Wang CSIE CYUT 136
Chapter 17
17.1 言
1.
2. C 語言 式
3. 程式
4.
5. 式 stdio.h
17.2
1. 語�1 FILE *fopen( const char * filename, const char * mode );� �
2. mode 式
moderw
a
r+w+
a+
3. mode (binary) b
137
17.3. CHAPTER 17.
�1 "rb", "wb", "ab", "ab+", "a+b", "wb+", "w+b", "ab+", "a+b"� �
4. 語�1 int fclose( FILE *fp );� �
17.3
1. �1 [dywang@dyw219 zzz]$ vim fileio1.c
[dywang@dyw219 zzz]$ cat fileio1.c3 #include <stdio.h>
5 int main( int argc, char *argv[] ) {FILE *fp;
7fp = fopen( argv[1], "r" );
9 if( fp != NULL) {printf("File %s exist.\n", argv[1]);
11 }else {
13 printf("File %s does not exist.\n", argv[1]);}
15 fclose(fp);
17 return 0;}� �
2. �[dywang@dyw219 zzz]$ gcc -o fileio1 fileio1.c� �
3. fileio.txt fileio.aaa
�1 [dywang@dyw219 zzz]$ ./fileio1 fileio.txt
File fileio.txt exist.3 [dywang@dyw219 zzz]$ ./fileio1 fileio.aaa
File fileio.aaa does not exist.� �
De-Yu Wang CSIE CYUT 138
17.4. CHAPTER 17.
17.4
1. 式
(a) 語�int fputc( char ch, FILE *fp );� �
(b) 語�1 int fputs( const char *s, FILE *fp );� �
(c) 式 語 format printf�1 int fprintf(FILE *stream, const char *format, ...)� �
2. �1 [dywang@dyw219 zzz]$ vim fileio2.c
[dywang@dyw219 zzz]$ cat fileio2.c3 #include <stdio.h>
5 int main( int argc, char *argv[] ) {FILE *fp;
7 char ch='A';
9 fp = fopen( argv[1], "w" );if( fp != NULL) {
11 fputc( ch, fp);fputs( "--B\n", fp);
13 fprintf( fp, "%s %s %d\n", "str1", "str2", 2019);}
15 else {printf("File %s does not exist.\n", argv[1]);
17 }fclose(fp);
19return 0;
21 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o fileio2 fileio2.c� �
De-Yu Wang CSIE CYUT 139
17.5. CHAPTER 17.
4. fileio2 fio2test�1 [dywang@dyw219 zzz]$ ./fileio2 fio2test� �
5. fio2test�1 [dywang@dyw219 zzz]$ cat fio2test
A--B3 str1 str2 2019� �
17.5
1. 式
(a) 語�1 int fgetc( FILE * fp );� �
(b) 語�1 char *fgets( char *buf, int n, FILE *fp );� �
(c) 式 語 format 式 printf 式�1 int fscanf(FILE *stream, const char *format, ...)� �
2. fileio2.c 式�1 [dywang@dyw219 zzz]$ vim fileio3.c
[dywang@dyw219 zzz]$ cat fileio3.c3 #include <stdio.h>
5 int main( int argc, char *argv[] ) {FILE *fp;
7 char ch, buff1[10], buff2[10], buff3[10];int i;
9fp = fopen( argv[1], "r" );
11 if( fp != NULL) {ch = fgetc(fp);
13 fgets(buff1, 4, fp);fscanf(fp, "%s %s %d", buff2, buff3, &i );
De-Yu Wang CSIE CYUT 140
17.6. CHAPTER 17.
15 printf("%c%s\n%s %s %d\n", ch, buff1, buff2, buff3, i);}
17 else {printf("File %s does not exist.\n", argv[1]);
19 }fclose(fp);
21return 0;
23 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o fileio3 fileio3.c� �4. fileio3 fio2test
式 �1 [dywang@dyw219 zzz]$ ./fileio3 fio2test
A--B3 str1 str2 2019� �
5. C 語言程式
3 12 34 6 7Ans=5,62
17.6
1. 式
(a) size_of_elements number_of_elements
�1 size_t fread(void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);� �(b) size_of_elements number_of_elements
�size_t fwrite(const void *ptr, size_t size_of_elements,
2 size_t number_of_elements, FILE *a_file);� �
De-Yu Wang CSIE CYUT 141
17.7. FSEEK 式 CHAPTER 17.
2. fread 0 ( )fwrite�
[dywang@dyw219 zzz]$ vim fileio4.c2 [dywang@dyw219 zzz]$ cat fileio4.c
#include <stdio.h>4
int main( int argc, char *argv[] ) {6 FILE *fp1, *fp2;
char ch;8
fp1 = fopen( argv[1], "rb" );10 fp2 = fopen( argv[2], "wb" );
if( fp1 != NULL) {12 while ( fread( &ch, sizeof(ch), 1, fp1) != 0 )
fwrite( &ch, sizeof(ch), 1, fp2 );14 }
else {16 printf("File %s does not exist.\n", argv[1]);
}18 fclose(fp1);
fclose(fp2);20
return 0;22 }� �
3. �[dywang@dyw219 zzz]$ gcc -o fileio4 fileio4.c� �
4. 式 fileio1 fileio1.bak�1 [dywang@dyw219 zzz]$ ./fileio4 fileio1 fileio1.bak� �
5. diff fileio1 fileio1.bak�1 [dywang@dyw219 zzz]$ diff fileio1 fileio1.bak� �
17.7 fseek 式
1. fseek 式
(a) 語 formwhere offset
De-Yu Wang CSIE CYUT 142
17.7. FSEEK 式 CHAPTER 17.
�1 int fseek(FILE *stream, long offset, int fromwhere);� �
(b) SEEK
i. SEEK_SETii. SEEK_CURiii. SEEK_END
2. fread 0 ( )fwrite�1 [dywang@dyw219 zzz]$ vim fileio5.c
[dywang@dyw219 zzz]$ cat fileio5.c3 #include <stdio.h>
5 int main( int argc, char *argv[] ) {FILE *fp1;
7 char ch;
9 fp1 = fopen( argv[1], "r" );if( fp1 != NULL) {
11 while( (ch=fgetc(fp1)) != EOF )printf("%c", ch);
13 fseek(fp1, 2, SEEK_SET);while( (ch=fgetc(fp1)) != EOF )
15 printf("%c", ch);}
17 else {printf("File %s does not exist.\n", argv[1]);
19 }fclose(fp1);
21return 0;
23 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o fileio5 fileio5.c� �4. fio5test�
1 [dywang@dyw219 zzz]$ echo 'abc 123' > fio5test[dywang@dyw219 zzz]$ cat fio5test
3 abc 123� �
De-Yu Wang CSIE CYUT 143
17.8. CHAPTER 17.
5. 2
�1 [dywang@dyw219 zzz]$ ./fileio5 fio5test
abc 1233 c 123� �
17.8
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
(a) 程式 fio1.c 式":"
fio1�1 cat a.txt
UjsAbc dsdef Gshi Asdsdf 1sdsa23 Fdsdty3 ./fio1 a.txt
UjsAbc:Gshi:Asdsdf:Fdsdty:� �(b) fio1.c 程式 fio2.c
fio2
(c) 程式 fio3.c 式 1.2. 3. 4.
式 1fio3
1
De-Yu Wang CSIE CYUT 144
Chapter 18
18.1 言
1. (structure)
�struct Books {
2 char title[50];char author[50];
4 int book_id;}� �
2. (union) structunion
unionchar, int, long 1, 4, 8 union_name 8
�1 union union_name {
char ch;3 int num1;
long num2;5 }� �
18.2
1. 語�1 struct [structure tag] {
member definition;3 member definition;
...5 member definition;
145
18.2. CHAPTER 18.
} [one or more structure variables];� �2. structure structure (book)
�struct Books {
2 char title[50];char author[50];
4 int book_id;} book;� �
3. �1 [dywang@dyw219 zzz]$ vim struct1.c
[dywang@dyw219 zzz]$ cat struct1.c3 #include <stdio.h>
#include <string.h>5
struct Books {7 char title[50];
char author[50];9 int book_id;
};11
int main () {13 struct Books book1;
struct Books book2;15
strcpy( book1.title, "RHCSA");17 strcpy( book1.author, "dywang");
book1.book_id = 123456;19
strcpy( book2.title, "Python");21 strcpy( book2.author, "Linda");
book2.book_id = 123321;23
printf( "book1.title : %s\n", book1.title);25 printf( "book1.author : %s\n", book1.author);
printf( "book1.book_id : %d\n", book1.book_id);27
printf( "book2.title : %s\n", book2.title);29 printf( "book2.author : %s\n", book2.author);
printf( "book2.book_id : %d\n", book2.book_id);31
return 0;33 }� �
4.
De-Yu Wang CSIE CYUT 146
18.3. 式 CHAPTER 18.
�1 [dywang@dyw219 zzz]$ gcc -o struct1 struct1.c� �
5. �1 [dywang@dyw219 zzz]$ ./struct1
book1.title : RHCSA3 book1.author : dywang
book1.book_id : 1234565 book2.title : Python
book2.author : Linda7 book2.book_id : 123321� �
18.3 式
1. struct Books title, author, book_id 式 print-Book�1 [dywang@dyw219 zzz]$ cat struct2.c
#include <stdio.h>3 #include <string.h>
5 struct Books {char title[50];
7 char author[50];int book_id;
9 };
11 void printBook( struct Books book ) {printf( "book.title : %s\n", book.title);
13 printf( "book.author : %s\n", book.author);printf( "book.book_id : %d\n", book.book_id);
15 book.book_id = 999999;}
17int main () {
19 struct Books book1;struct Books book2;
21strcpy( book1.title, "RHCSA");
23 strcpy( book1.author, "dywang");book1.book_id = 123456;
25strcpy( book2.title, "Python");
27 strcpy( book2.author, "Linda");book2.book_id = 123321;
29printBook( book1 );
31 printf( "book1_id : %d\n", book1.book_id);
De-Yu Wang CSIE CYUT 147
18.4. 式 CHAPTER 18.
printBook( book2 );33 printf( "book2_id : %d\n", book2.book_id);
35 return 0;}� �
2. �[dywang@dyw219 zzz]$ gcc -o struct2 struct2.c� �
3. 式 printBook struct 式 printBookbook_id=999999 式 bbok1.book_id 123456
book2.book_id 123321�1 book.title : RHCSA
book.author : dywang3 book.book_id : 123456
book1_id : 1234565 book.title : Python
book.author : Linda7 book.book_id : 123321
book2_id : 123321� �
18.4 式
1.
(a) �struct Books *struct_pointer;� �
(b) �1 struct_pointer = &Book1;� �
(c) �1 struct_pointer->title;� �
2.
De-Yu Wang CSIE CYUT 148
18.4. 式 CHAPTER 18.
�1 [dywang@dyw219 zzz]$ vim struct3.c
[dywang@dyw219 zzz]$ cat struct3.c3 #include <stdio.h>
#include <string.h>5
struct Books {7 char title[50];
char author[50];9 int book_id;
};11
void printBook( struct Books *book ) {13 printf( "book.title : %s\n", book->title);
printf( "book.author : %s\n", book->author);15 printf( "book.book_id : %d\n", book->book_id);
book->book_id = 999999;17 }
19 int main () {struct Books book1;
21 struct Books book2;
23 strcpy( book1.title, "RHCSA");strcpy( book1.author, "dywang");
25 book1.book_id = 123456;
27 strcpy( book2.title, "Python");strcpy( book2.author, "Linda");
29 book2.book_id = 123321;
31 printBook( &book1 );printf( "book1_id : %d\n", book1.book_id);
33 printBook( &book2 );printf( "book2_id : %d\n", book2.book_id);
35return 0;
37 }� �3. �
1 [dywang@dyw219 zzz]$ gcc -o struct3 struct3.c� �4. 式 printBook struct 式 printBook
book_id=999999 式 bbok1.book_id 99999book2.book_id 999999�1 [dywang@dyw219 zzz]$ ./struct3
book.title : RHCSA3 book.author : dywang
book.book_id : 123456
De-Yu Wang CSIE CYUT 149
18.5. BIT FILEDS CHAPTER 18.
5 book1_id : 999999book.title : Python
7 book.author : Lindabook.book_id : 123321
9 book2_id : 999999� �
18.5 Bit Fileds
1. Bit Fields structure 語�1 struct {
type [member_name] : width ;3 };� �
2. bit-field
(a) cannot take address of bit-field fscanf, printf
(b)
(c) sizeof
3. age 3 0 7�1 struct {
unsigned int age : 3;3 } Age;� �
4. age=8 3�1 [dywang@dyw219 zzz]$ vim struct4.c
[dywang@dyw219 zzz]$ cat struct4.c3 #include <stdio.h>
#include <string.h>5
struct {7 unsigned int age : 3;
} Age;9
int main () {11 Age.age = 4;
printf( "Sizeof( Age ) : %d\n", sizeof(Age) );13 printf( "Age.age : %d\n", Age.age );
15 Age.age = 7;printf( "Age.age : %d\n", Age.age );
17
De-Yu Wang CSIE CYUT 150
18.6. UNION CHAPTER 18.
Age.age = 8;19 printf( "Age.age : %d\n", Age.age );
21 return 0;}� �
5. Age.age=8 4�[dywang@dyw219 zzz]$ gcc -o struct4 struct4.c
2 struct4.c: In function main:struct4.c:16:2: warning: large integer implicitly truncated to unsigned
type [-Woverflow]4 Age.age = 8;
^� �6. main 式�
1 [dywang@dyw219 zzz]$ gcc -o struct4 struct4.c� �7. struct Age int 4 (32 ) 3
age�1 [dywang@dyw219 zzz]$ ./struct4
Sizeof( Age ) : 43 Age.age : 4
Age.age : 7� �
18.6 Union
1. Unionunion�
union [union tag] {2 member definition;
member definition;4 ...
member definition;6 } [one or more union variables];� �
2.
De-Yu Wang CSIE CYUT 151
18.7. UNION CHAPTER 18.
�union Data {
2 int i;float f;
4 char str[20];} data;� �
3. �1 [dywang@dyw219 zzz]$ vim union1.c
[dywang@dyw219 zzz]$ cat union1.c3 #include <stdio.h>
5 union Data {int i;
7 float f;char str[20];
9 };
11 int main () {union Data data;
13printf( "sizeof(data) = %d\n", sizeof(data));
15return 0;
17 }� �4. �
1 [dywang@dyw219 zzz]$ gcc -o union1 union1.c� �5. int, float 4 char str[20] 20
union data 20�1 [dywang@dyw219 zzz]$ ./union1
sizeof(data) = 20� �
18.7 Union
1. union�[dywang@dyw219 zzz]$ vim union2.c
2 [dywang@dyw219 zzz]$ cat union2.c#include <stdio.h>
De-Yu Wang CSIE CYUT 152
18.7. UNION CHAPTER 18.
4 #include <string.h>
6 union Data {int i;
8 float f;char str[20];
10 };
12 int main () {union Data data;
14 data.i = 10;data.f = 220.5;
16 strcpy( data.str, "C Programming");
18 printf( "data.i : %d\n", data.i);printf( "data.f : %f\n", data.f);
20 printf( "data.str : %s\n", data.str);
22 return 0;}� �
2. �1 [dywang@dyw219 zzz]$ gcc -o union2 union2.c� �
3. i=10, f=220.5, str="C Programming" str�1 data.i : 1917853763
data.f : 4122360580327794860452759994368.0000003 data.str : C Programming� �
4. union�1 [dywang@dyw219 zzz]$ vim union3.c
[dywang@dyw219 zzz]$ cat union3.c3 #include <stdio.h>
#include <string.h>5
union Data {7 int i;
float f;9 char str[20];
};11
int main () {13 union Data data;
15 data.i = 10;
De-Yu Wang CSIE CYUT 153
18.8. CHAPTER 18.
printf( "data.i : %d\n", data.i);17
data.f = 220.5;19 printf( "data.f : %f\n", data.f);
21 strcpy( data.str, "C Programming");printf( "data.str : %s\n", data.str);
23return 0;
25 }� �5. �
1 [dywang@dyw219 zzz]$ gcc -o union3 union3.c� �6. �
1 [dywang@dyw219 zzz]$ ./union3data.i : 10
3 data.f : 220.500000data.str : C Programming� �
18.8
1.
(a) zzz
(b) zzz
(c)
2. grade.txt C 語言程式
(a) 程式 strunion1.c structure student char name[20], unsignedint sid, unsigned short score
... NOT exists. 0student grade.txt
struct <TAB>strunion1�
./strunion1 ggg.txt2 ggg.txt NOT exist.
./strunion1 grade.txt4 sid=27010 name=Alisa score=91
sid=27021 name=Brook score=35
De-Yu Wang CSIE CYUT 154
18.8. CHAPTER 18.
6 sid=27091 name=Crystal score=76sid=27102 name=Jenny score=60� �
(b) strunion1.c 程式 strunion2.c struct式 printgrade 式 printgradestrunion2
(c) strunion2.c 程式 strunion3.c struct式 printgrade 式 printgradestrunion3
(d) strunion3.c 程式 strunion4.c score 6 score64 strunion4 grade.txt
score 6464�
1 ./strunion4 grade.txtsid=27010 name=Alisa score=27
3 sid=27021 name=Brook score=35sid=27091 name=Crystal score=12
5 sid=27102 name=Jenny score=60� �(e) strunion1.c 程式 strunion5.c student structure union
char name[13] union studentstrunion5 union
score union student scorename�
1 ./strunion5 grade.txtsid=91 name=[ score=91
3 sid=35 name=# score=35sid=76 name=L score=76
5 sid=60 name=< score=60sizeof(student)=16� �
De-Yu Wang CSIE CYUT 155
Chapter 19
C
19.1
1. C (Preprocessor)
2. (#)
#define#include .h#undef#ifdef true#ifndef true#if if#else if#elif if#endif#error stderr#pragma compiler
; compiler
3. #define CPP MAX_ARRAY_LENGTH 20�#define MAX_ARRAY_LENGTH 20� �
4. #include CPP 式 stdio.h myheader.h
�1 #include <stdio.h>
#include "myheader.h"� �
156
19.2. CHAPTER 19. C
19.2
1. ANSI
__DATE__ 式"MMM DD YYYY"__TIME__ 式"HH:MM:SS"__FILE____LINE____STDC__ ANSI 1
2. �[dywang@dyw219 zzz]$ vim preprocess1.c
2 [dywang@dyw219 zzz]$ cat preprocess1.c#include <stdio.h>
4main() {
6 printf("File :%s\n", __FILE__ );printf("Date :%s\n", __DATE__ );
8 printf("Time :%s\n", __TIME__ );printf("Line :%d\n", __LINE__ );
10 printf("ANSI :%d\n", __STDC__ );}� �
3. �1 [dywang@dyw219 zzz]$ gcc -o preprocess1 preprocess1.c� �
4. �1 [dywang@dyw219 zzz]$ ./preprocess1
File :preprocess1.c3 Date :Jul 27 2019
Time :10:08:405 Line :7
ANSI :1� �
19.3
1. Macro Continuation (\)�#define message_for(a, b) \
2 printf(#a " and " #b ": We love you!\n")
De-Yu Wang CSIE CYUT 157
19.3. CHAPTER 19. C
� �2. Stringize (#)
(a) �[dywang@dyw219 zzz]$ vim preprocess2.c
2 [dywang@dyw219 zzz]$ cat preprocess2.c#include <stdio.h>
4#define message_for(a, b) \
6 printf(#a " and " #b ": We love you!\n")
8 int main(void) {message_for(Carole, Debra);
10 return 0;}� �
(b) �1 [dywang@dyw219 zzz]$ gcc -o preprocess2 preprocess2.c� �
(c) �1 [dywang@dyw219 zzz]$ ./preprocess2
Carole and Debra: We love you!� �3. Token Pasting (##)
(a) �[dywang@dyw219 zzz]$ vim preprocess3.c
2 [dywang@dyw219 zzz]$ cat preprocess3.c#include <stdio.h>
4#define tokenpaster(n) printf ("token" #n " = %d\n", token##n)
6int main(void) {
8 int token34 = 40;
10 tokenpaster(34);return 0;
12 }� �(b)
De-Yu Wang CSIE CYUT 158
19.4. CHAPTER 19. C
�[dywang@dyw219 zzz]$ gcc -o preprocess3 preprocess3.c� �
(c) �1 [dywang@dyw219 zzz]$ ./preprocess3
token34 = 40� �4. defined() 式
(a) �[dywang@dyw219 zzz]$ vim preprocess4.c
2 [dywang@dyw219 zzz]$ cat preprocess4.c#include <stdio.h>
4#if !defined (MESSAGE)
6 #define MESSAGE "You wish!"#endif
8int main(void) {
10 printf("Here is the message: %s\n", MESSAGE);return 0;
12 }� �(b) �
[dywang@dyw219 zzz]$ gcc -o preprocess4 preprocess4.c� �(c) �
1 [dywang@dyw219 zzz]$ ./preprocess4Here is the message: You wish!� �
19.4
1. 式 式�int square(int x) {
2 return x * x;}� �
De-Yu Wang CSIE CYUT 159
19.5. .H CHAPTER 19. C
2. �1 #define square(x) ((x) * (x))� �
3. �1 [dywang@dyw219 zzz]$ vim preprocess5.c
[dywang@dyw219 zzz]$ cat preprocess5.c3 #include <stdio.h>
5 #define MAX(x,y) ((x) > (y) ? (x) : (y))
7 int main(void) {printf("Max between 20 and 10 is %d\n", MAX(10, 20));
9 return 0;}� �
4. �[dywang@dyw219 zzz]$ gcc -o preprocess5 preprocess5.c� �
5. �1 [dywang@dyw219 zzz]$ ./preprocess5
Max between 20 and 10 is 20� �
19.5 .h
1. Include 語 .h 式�#include <file.h>� �
2. Include 語 .h 程式�1 #include "file.h"� �
3.
(a) square.h
De-Yu Wang CSIE CYUT 160
19.6. CHAPTER 19. C
�1 [dywang@dyw219 zzz]$ vim square.h
[dywang@dyw219 zzz]$ cat square.h3 int square(int);� �
(b) 程式 square.c 式 square�1 [dywang@dyw219 zzz]$ cat square.c
int square(int x) {3 return x * x;
}� �(c) 程式 square.h include 程式�
[dywang@dyw219 zzz]$ vim preprocess6.c2 [dywang@dyw219 zzz]$ cat preprocess6.c
#include <stdio.h>4 #include "square.h"
6 int main (void){int x=3;
8 printf("square %d = %d\n", x,square(x));}� �
(d) square.c�1 [dywang@dyw219 zzz]$ gcc -o preprocess6 preprocess6.c square.c� �
(e) �1 [dywang@dyw219 zzz]$ ./preprocess6
square 3 = 9� �
19.6
1.
(a) zzz
(b) zzz
(c)
2. C 語言程式
De-Yu Wang CSIE CYUT 161
19.6. CHAPTER 19. C
(a) 程式 prepro1.c happy_for(name) stringize #name 5 name Mother 8
Father __DATA__Aug 9 2019 5 8 Only 5 8
prepro1�./prepro1 5 8 3
2 Happy Mother's Day! Aug 9 2019Happy Father's Day! Aug 9 2019
4 Only 5 8� �(b) 程式 prepro2.c tokenpast(N) token pasting ##
token n int token1=10, token2=11, token3=21tokenpast(N) tokenN * 2 = xx N
1, 2, 3 only 1 2 3__DATA__
prepro2�./prepro2 1 2 3 5
2 token1 * 2 = 20 (Aug 9 2019)token2 * 2 = 22 (Aug 9 2019)
4 token3 * 2 = 42 (Aug 9 2019)Only 1 2 3� �
(c) 程式 prepro3.c MIN(x,y) x, y
__DATA__x or y NOT a number! 0
prepro3�1 ./prepro3 11 22
MIN between 11 and 22 is 11 (Aug 9 2019)3 ./prepro3 11 a
11 or a NOT a number!� �(d) 程式
i. swap.h�void swap(int *x, int *y);� �
ii. 程式 swap.c 式 swap(*x, *y) x, yiii. 程式 prepro4.c swap.h include 程式 call for reference 式
swap x + y*2 x, y
De-Yu Wang CSIE CYUT 162
19.6. CHAPTER 19. C
__DATA__x or y NOT a number! 0
prepro4�1 ./prepro4 2 5
After swap, 5 + 2*2 = 9 (Aug 9 2019)3 ./prepro4 2 b
2 or b NOT a number!� �
De-Yu Wang CSIE CYUT 163
Chapter 20
gdb
20.1 gdb
1. gdb FSF (Free Software Foundation)
2. GNU gdb
3. gdb GUI
20.2 gdb
1. gdb�[root@dyH ~]# yum install gdb� �
2. vim 程式 gdbtest1.c�1 int main()
{3 int a, b, c;
a=5;5 b=10;
b+=a;7 c=b+a;
return 0;9 }� �
3. 程式�1 [dywang@dyH gcc]$ gcc -Wall -g -o gdbtest1 gdbtest1.c� �
4. gdb l
164
20.2. GDB CHAPTER 20. GDB
�1 [dywang@dyH gcc]$ gdb -q gdbtest1
Reading symbols from gdbtest1...done.3 (gdb) l
1 int main()5 2 {
3 int a, b, c;7 4 a=5;
5 b=10;9 6 b+=a;
7 c=b+a;11 8 return 0;
9 }� �5. gdb b�
(gdb) b 22 Breakpoint 1 at 0x400478: file gdbtest1.c, line 2.� �
6. gdb r 程式 debuginfos�(gdb) r
2 Starting program: /home/dywang/Documents/latex/clanguage/gcc/gdbtest1
4 Breakpoint 1, main () at gdbtest1.c:44 a=5;
6 Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6_4.2.x86_64� �
7. debuginfos�[root@dyH ~]# vim /etc/yum.repos.d/CentOS-Debuginfo.repo
2 ...enabled=1
4[root@dyH ~]# debuginfo-install glibc-2.12-1.107.el6_4.2.x86_64� �
8. gdb r 程式�1 (gdb) r
The program being debugged has been started already.3 Start it from the beginning? (y or n) y
5 Starting program: /home/dywang/Documents/latex/clanguage/gcc/gdbtest1
7 Breakpoint 1, main () at gdbtest1.c:4
De-Yu Wang CSIE CYUT 165
20.3. PYTHON GDB CHAPTER 20. GDB
4 a=5;� �9. gdb p b 0�
(gdb) p b2 $1 = 0� �
10. gdb n b 10 a 5�(gdb) n
2 5 b=10;(gdb) n
4 6 b+=a;(gdb) p a
6 $2 = 5(gdb) p b
8 $3 = 10(gdb) n
10 7 c=b+a;(gdb) p b
12 $4 = 15� �11. gdb n b 15�
(gdb) n2 7 c=b+a;
(gdb) p b4 $4 = 15� �
12. gdb c 程式 q gdb�(gdb) c
2 Continuing.
4 Program exited normally.(gdb) q� �
20.3 Python gdb
1. python gdb
De-Yu Wang CSIE CYUT 166
20.4. GDB CHAPTER 20. GDB
�1 [dywang@dyw219 python]$ python -m gdb str.py� �
20.4 gdb
1. gdb�1 [dywang@dyH gcc]$ gdb -q gdbtest1
Reading symbols from gdbtest1...done.3 (gdb) help
List of classes of commands:5
aliases -- Aliases of other commands7 breakpoints -- Making program stop at certain points
data -- Examining data9 files -- Specifying and examining files
internals -- Maintenance commands11 obscure -- Obscure features
running -- Running the program13 stack -- Examining the stack
status -- Status inquiries15 support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program17 user-defined -- User-defined commands
19 ---Type <return> to continue, or q <return> to quit---Type "help" followed by a class name for a list of commands in that
class.21 Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.23 Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.� �2. gdb running�
(gdb) help running2 Running the program.
4 List of commands:
6 advance -- Continue the program up to the given location (same form asargs for break command)
attach -- Attach to a process or file outside of GDB8 continue -- Continue program being debugged
detach -- Detach a process or file previously attached10 detach checkpoint -- Detach from a checkpoint (experimental)
detach inferior -- Detach from inferior ID12 disconnect -- Disconnect from a target
finish -- Execute until selected stack frame returns
De-Yu Wang CSIE CYUT 167
20.4. GDB CHAPTER 20. GDB
14 handle -- Specify how to handle a signalinferior -- Use this command to switch between inferiors
16 ---Type <return> to continue, or q <return> to quit---interrupt -- Interrupt the execution of the debugged program
18 jump -- Continue program being debugged at specified line or addresskill -- Kill execution of program being debugged
20 kill inferior -- Kill inferior IDnext -- Step program
22 nexti -- Step one instructionreverse-continue -- Continue program being debugged but run it in
reverse24 reverse-finish -- Execute backward until just before selected stack
frame is calledreverse-next -- Step program backward
26 reverse-nexti -- Step backward one instructionreverse-step -- Step program backward until it reaches the beginning of
another source line28 reverse-stepi -- Step backward exactly one instruction
run -- Start debugged program30 ---Type <return> to continue, or q <return> to quit---
signal -- Continue program giving it signal specified by the argument32 start -- Run the debugged program until the beginning of the main
procedurestep -- Step program until it reaches a different source line
34 stepi -- Step one instruction exactlytarget -- Connect to a target machine or process
36 target child -- Unix child process (started by the "run" command)target core -- Use a core file as a target
38 target exec -- Use an executable file as a targettarget extended-remote -- Use a remote computer via a serial line
40 target multi-thread -- Threads and pthreads supporttarget record -- Log program while executing and replay execution from
log42 target record-core -- Log program while executing and replay execution
from logtarget remote -- Use a remote computer via a serial line
44 target tfile -- Use a trace file as a targettask -- Use this command to switch between Ada tasks
46 ---Type <return> to continue, or q <return> to quit---thread -- Use this command to switch between threads
48 thread apply -- Apply a command to a list of threadsthread apply all -- Apply a command to all threads
50 until -- Execute until the program reaches a source line greater thanthe current
52 Type "help" followed by command name for full documentation.Type "apropos word" to search for commands related to "word".
54 Command name abbreviations are allowed if unambiguous.� �
De-Yu Wang CSIE CYUT 168
20.5. GDB CHAPTER 20. GDB
20.5 gdb
1. gdb display b�[dywang@dyH gcc]$ gdb -q gdbtest1
2 Reading symbols from gdbtest1...done.(gdb) l
4 1 int main()2 {
6 3 int a, b, c;4 a=5;
8 5 b=10;6 b+=a;
10 7 c=b+a;8 return 0;
12 9 }(gdb) b 2
14 Breakpoint 1 at 0x400478: file gdbtest1.c, line 2.(gdb) r
16 Starting program: gdbtest1
18 Breakpoint 1, main () at gdbtest1.c:44 a=5;
20 (gdb) display b1: b = 0
22 (gdb) n5 b=10;
24 1: b = 0(gdb) n
26 6 b+=a;1: b = 10
28 (gdb) n7 c=b+a;
30 1: b = 15(gdb) n
32 8 return 0;1: b = 15
34 (gdb) n9 }
36 1: b = 15(gdb) c
38 Continuing.
40 Program exited normally.(gdb) q� �
2. gdb info display
�1 [dywang@dyH gcc]$ gdb -q gdbtest1
Reading symbols from gdbtest1...done.3 (gdb) b 2
De-Yu Wang CSIE CYUT 169
20.5. GDB CHAPTER 20. GDB
Breakpoint 1 at 0x400478: file gdbtest1.c, line 2.5 (gdb) r
Starting program: gdbtest17
Breakpoint 1, main () at gdbtest1.c:49 4 a=5;
(gdb) info display11 There are no auto-display expressions now.
(gdb) info break13 Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400478 in main at gdbtest1.c:2
15 breakpoint already hit 1 time� �3. a display info enable�
1 (gdb) display a1: a = 32767
3 (gdb) info displayAuto-display expressions now in effect:
5 Num Enb Expression1: y a� �
4. disable a display info disable�(gdb) disable display 1
2 (gdb) info displayAuto-display expressions now in effect:
4 Num Enb Expression1: n a� �
5. disable 1 info disable�1 (gdb) disable break 1
(gdb) info break3 Num Type Disp Enb Address What
1 breakpoint keep n 0x0000000000400478 in main at gdbtest1.c:2
5 breakpoint already hit 1 time� �6. b c display�
1 (gdb) display b2: b = 0
3 (gdb) display c3: c = 0
De-Yu Wang CSIE CYUT 170
20.5. GDB CHAPTER 20. GDB
5 (gdb) info displayAuto-display expressions now in effect:
7 Num Enb Expression3: y c
9 2: y b1: n a� �
7. enable a display�(gdb) enable display 1
2 (gdb) info displayAuto-display expressions now in effect:
4 Num Enb Expression3: y c
6 2: y b1: y a� �
8. a, b, c display�1 (gdb) n
5 b=10;3 3: c = 0
2: b = 05 1: a = 5� �
9. delete display�1 (gdb) delete display 1
(gdb) info display3 Auto-display expressions now in effect:
Num Enb Expression5 3: y c
2: y b7 (gdb) delete display 2
(gdb) info display9 Auto-display expressions now in effect:
Num Enb Expression11 3: y c� �
De-Yu Wang CSIE CYUT 171
Chapter 21
Strip程式
21.1
1. strip readlef�1 [root@dyH ~]# yum install binutils� �
2. 程式�1 #include<stdio.h>
3 // Declare a static globalstatic int i=10;
5 // Declare a non static globalint global = 20;
7int inc_func()
9 {static int local = 0;
11 // return static local valuereturn (++local);
13 }
15 int main(void){
17 int count = inc_func();// Print the sum
19 printf( "\n [%d] \n",(count + global + i));
21 return 0;}� �
3. 式 程式�[dywang@dyH gcc]$ gcc -g -o stripex1 stripex1.c� �
172
21.2. CHAPTER 21. STRIP 程式
4. �1 [dywang@dyH gcc]$ ll stripex1*
-rwxrwxr-x. 1 dywang dywang 8195 Sep 1 06:22 stripex13 -rw-rw-r--. 1 dywang dywang 323 Aug 31 22:19 stripex1.c� �
21.2
1. ELF(Executable and Linkable Format) 式 stripex175�
1 [dywang@dyH gcc]$ readelf -s stripex1� ��
1 # readelf -s stripex1
3 Symbol table '.dynsym' contains 4 entries:Num: Value Size Type Bind Vis Ndx Name
5 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@GLIBC_2.2.5 (2)7 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)9
Symbol table '.symtab' contains 75 entries:11 Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND13 1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
2: 000000000040021c 0 SECTION LOCAL DEFAULT 215 3: 000000000040023c 0 SECTION LOCAL DEFAULT 3
4: 0000000000400260 0 SECTION LOCAL DEFAULT 417 5: 0000000000400280 0 SECTION LOCAL DEFAULT 5
6: 00000000004002e0 0 SECTION LOCAL DEFAULT 619 7: 0000000000400320 0 SECTION LOCAL DEFAULT 7
8: 0000000000400328 0 SECTION LOCAL DEFAULT 821 9: 0000000000400348 0 SECTION LOCAL DEFAULT 9
10: 0000000000400360 0 SECTION LOCAL DEFAULT 1023 11: 0000000000400390 0 SECTION LOCAL DEFAULT 11
12: 00000000004003a8 0 SECTION LOCAL DEFAULT 1225 13: 00000000004003e0 0 SECTION LOCAL DEFAULT 13
14: 0000000000400608 0 SECTION LOCAL DEFAULT 1427 15: 0000000000400618 0 SECTION LOCAL DEFAULT 15
16: 0000000000400634 0 SECTION LOCAL DEFAULT 1629 17: 0000000000400660 0 SECTION LOCAL DEFAULT 17
18: 0000000000600700 0 SECTION LOCAL DEFAULT 1831 19: 0000000000600710 0 SECTION LOCAL DEFAULT 19
20: 0000000000600720 0 SECTION LOCAL DEFAULT 20
De-Yu Wang CSIE CYUT 173
21.2. CHAPTER 21. STRIP 程式
33 21: 0000000000600728 0 SECTION LOCAL DEFAULT 2122: 00000000006008b8 0 SECTION LOCAL DEFAULT 22
35 23: 00000000006008c0 0 SECTION LOCAL DEFAULT 2324: 00000000006008e8 0 SECTION LOCAL DEFAULT 24
37 25: 00000000006008f8 0 SECTION LOCAL DEFAULT 2526: 0000000000000000 0 SECTION LOCAL DEFAULT 26
39 27: 0000000000000000 0 SECTION LOCAL DEFAULT 2728: 0000000000000000 0 SECTION LOCAL DEFAULT 28
41 29: 0000000000000000 0 SECTION LOCAL DEFAULT 2930: 0000000000000000 0 SECTION LOCAL DEFAULT 30
43 31: 0000000000000000 0 SECTION LOCAL DEFAULT 3132: 0000000000000000 0 SECTION LOCAL DEFAULT 32
45 33: 0000000000000000 0 SECTION LOCAL DEFAULT 3334: 000000000040040c 0 FUNC LOCAL DEFAULT 13
call_gmon_start47 35: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
36: 0000000000600700 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__49 37: 0000000000600710 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__
38: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__51 39: 0000000000400430 0 FUNC LOCAL DEFAULT 13
__do_global_dtors_aux40: 00000000006008f8 1 OBJECT LOCAL DEFAULT 25 completed
.634953 41: 0000000000600900 8 OBJECT LOCAL DEFAULT 25 dtor_idx.6351
42: 00000000004004a0 0 FUNC LOCAL DEFAULT 13 frame_dummy55 43: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
44: 0000000000600708 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__57 45: 00000000004006f8 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__
46: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_END__59 47: 00000000004005d0 0 FUNC LOCAL DEFAULT 13
__do_global_ctors_aux48: 0000000000000000 0 FILE LOCAL DEFAULT ABS stripex1.c
61 49: 00000000006008ec 4 OBJECT LOCAL DEFAULT 24 i50: 0000000000600908 4 OBJECT LOCAL DEFAULT 25 local.2052
63 51: 00000000006008c0 0 OBJECT LOCAL DEFAULT 23_GLOBAL_OFFSET_TABLE_
52: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_end
65 53: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_start
54: 0000000000600728 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC67 55: 00000000006008e8 0 NOTYPE WEAK DEFAULT 24 data_start
56: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDprintf@@GLIBC_2.2.5
69 57: 0000000000400530 2 FUNC GLOBAL DEFAULT 13__libc_csu_fini
58: 00000000004003e0 0 FUNC GLOBAL DEFAULT 13 _start71 59: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__60: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_Jv_RegisterClasses73 61: 0000000000400608 0 FUNC GLOBAL DEFAULT 14 _fini
62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND__libc_start_main@@GLIBC_
75 63: 00000000006008f0 4 OBJECT GLOBAL DEFAULT 24 global
De-Yu Wang CSIE CYUT 174
21.3. STRIP CHAPTER 21. STRIP 程式
64: 0000000000400618 4 OBJECT GLOBAL DEFAULT 15_IO_stdin_used
77 65: 00000000006008e8 0 NOTYPE GLOBAL DEFAULT 24 __data_start66: 0000000000400620 0 OBJECT GLOBAL HIDDEN 15 __dso_handle
79 67: 0000000000600718 0 OBJECT GLOBAL HIDDEN 19 __DTOR_END__68: 0000000000400540 137 FUNC GLOBAL DEFAULT 13
__libc_csu_init81 69: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
70: 0000000000600910 0 NOTYPE GLOBAL DEFAULT ABS _end83 71: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS _edata
72: 00000000004004c4 27 FUNC GLOBAL DEFAULT 13 inc_func85 73: 00000000004004df 67 FUNC GLOBAL DEFAULT 13 main
74: 0000000000400390 0 FUNC GLOBAL DEFAULT 11 _init� �2. strip�
ng@dyH gcc]$ strip -s stripex1� �3. �
1 [dywang@dyH gcc]$ readelf -s stripex1
3 Symbol table '.dynsym' contains 4 entries:Num: Value Size Type Bind Vis Ndx Name
5 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@GLIBC_2.2.5 (2)7 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)� �4. 8195 bytes 4368 bytes�
[dywang@dyH gcc]$ ll stripex1*2 -rwxrwxr-x. 1 dywang dywang 4368 Sep 1 06:41 stripex1
-rw-rw-r--. 1 dywang dywang 323 Aug 31 22:19 stripex1.c� �
21.3 strip
21.3.1 strip-debug1. 程式
De-Yu Wang CSIE CYUT 175
21.3. STRIP CHAPTER 21. STRIP 程式
�1 [dywang@dyH gcc]$ gcc -g -o stripex1 stripex1.c� �
2. �1 [dywang@dyH gcc]$ strip --strip-debug stripex1� �
3. 75 65 10�1
Symbol table '.dynsym' contains 4 entries:3 Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND5 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@GLIBC_2.2.5 (2)2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__7 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)
9 Symbol table '.symtab' contains 65 entries:Num: Value Size Type Bind Vis Ndx Name
11 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 000000000040040c 0 FUNC LOCAL DEFAULT 13
call_gmon_start13 2: 0000000000600700 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__
3: 0000000000600710 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__15 4: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__
5: 0000000000400430 0 FUNC LOCAL DEFAULT 13__do_global_dtors_aux
17 6: 00000000006008f8 1 OBJECT LOCAL DEFAULT 25 completed.6349
7: 0000000000600900 8 OBJECT LOCAL DEFAULT 25 dtor_idx.635119 8: 00000000004004a0 0 FUNC LOCAL DEFAULT 13 frame_dummy
9: 0000000000600708 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__21 10: 00000000004006f8 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__
11: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_END__23 12: 00000000004005d0 0 FUNC LOCAL DEFAULT 13
__do_global_ctors_aux13: 00000000006008ec 4 OBJECT LOCAL DEFAULT 24 i
25 14: 0000000000600908 4 OBJECT LOCAL DEFAULT 25 local.205215: 00000000006008c0 0 OBJECT LOCAL DEFAULT 23
_GLOBAL_OFFSET_TABLE_27 16: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18
__init_array_end17: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18
__init_array_start29 18: 0000000000600728 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC
19: 0000000000400200 0 SECTION LOCAL DEFAULT 131 20: 000000000040021c 0 SECTION LOCAL DEFAULT 2
21: 000000000040023c 0 SECTION LOCAL DEFAULT 3
De-Yu Wang CSIE CYUT 176
21.3. STRIP CHAPTER 21. STRIP 程式
33 22: 0000000000400260 0 SECTION LOCAL DEFAULT 423: 0000000000400280 0 SECTION LOCAL DEFAULT 5
35 24: 00000000004002e0 0 SECTION LOCAL DEFAULT 625: 0000000000400320 0 SECTION LOCAL DEFAULT 7
37 26: 0000000000400328 0 SECTION LOCAL DEFAULT 827: 0000000000400348 0 SECTION LOCAL DEFAULT 9
39 28: 0000000000400360 0 SECTION LOCAL DEFAULT 1029: 0000000000400390 0 SECTION LOCAL DEFAULT 11
41 30: 00000000004003a8 0 SECTION LOCAL DEFAULT 1231: 00000000004003e0 0 SECTION LOCAL DEFAULT 13
43 32: 0000000000400608 0 SECTION LOCAL DEFAULT 1433: 0000000000400618 0 SECTION LOCAL DEFAULT 15
45 34: 0000000000400634 0 SECTION LOCAL DEFAULT 1635: 0000000000400660 0 SECTION LOCAL DEFAULT 17
47 36: 0000000000600700 0 SECTION LOCAL DEFAULT 1837: 0000000000600710 0 SECTION LOCAL DEFAULT 19
49 38: 0000000000600720 0 SECTION LOCAL DEFAULT 2039: 0000000000600728 0 SECTION LOCAL DEFAULT 21
51 40: 00000000006008b8 0 SECTION LOCAL DEFAULT 2241: 00000000006008c0 0 SECTION LOCAL DEFAULT 23
53 42: 00000000006008e8 0 SECTION LOCAL DEFAULT 2443: 00000000006008f8 0 SECTION LOCAL DEFAULT 25
55 44: 0000000000000000 0 SECTION LOCAL DEFAULT 2645: 00000000006008e8 0 NOTYPE WEAK DEFAULT 24 data_start
57 46: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDprintf@@GLIBC_2.2.5
47: 0000000000400530 2 FUNC GLOBAL DEFAULT 13__libc_csu_fini
59 48: 00000000004003e0 0 FUNC GLOBAL DEFAULT 13 _start49: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__61 50: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_Jv_RegisterClasses51: 0000000000400608 0 FUNC GLOBAL DEFAULT 14 _fini
63 52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND__libc_start_main@@GLIBC_
53: 00000000006008f0 4 OBJECT GLOBAL DEFAULT 24 global65 54: 0000000000400618 4 OBJECT GLOBAL DEFAULT 15
_IO_stdin_used55: 00000000006008e8 0 NOTYPE GLOBAL DEFAULT 24 __data_start
67 56: 0000000000400620 0 OBJECT GLOBAL HIDDEN 15 __dso_handle57: 0000000000600718 0 OBJECT GLOBAL HIDDEN 19 __DTOR_END__
69 58: 0000000000400540 137 FUNC GLOBAL DEFAULT 13__libc_csu_init
59: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS __bss_start71 60: 0000000000600910 0 NOTYPE GLOBAL DEFAULT ABS _end
61: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS _edata73 62: 00000000004004c4 27 FUNC GLOBAL DEFAULT 13 inc_func
63: 00000000004004df 67 FUNC GLOBAL DEFAULT 13 main75 64: 0000000000400390 0 FUNC GLOBAL DEFAULT 11 _init� �
4. 8195 bytes 6581 bytes�1 [dywang@dyH gcc]$ ll stripex1*
De-Yu Wang CSIE CYUT 177
21.3. STRIP CHAPTER 21. STRIP 程式
-rwxrwxr-x. 1 dywang dywang 6581 Sep 1 06:52 stripex13 -rw-rw-r--. 1 dywang dywang 323 Aug 31 22:19 stripex1.c� �
21.3.2 strip-unneeded1. 程式�
1 [dywang@dyH gcc]$ gcc -g -o stripex1 stripex1.c� �2. -a elf�
1 [dywang@dyH gcc]$ strip --strip-debug stripex1[dywang@dyH gcc]$ readelf -a stripex1 | tee elfad.txt� �
3. -a elf�[dywang@dyH gcc]$ strip --strip-unneeded stripex1
2 [dywang@dyH gcc]$ readelf -a stripex1 | tee elfadun.txt[dywang@dyH gcc]$ diff elfad.txt elfadun.txt� �
4. �1 [dywang@dyH gcc]$ diff elfad.txt elfadun.txt | tee elfaundiff.txt� �
5. �1 13c13
< Start of section headers: 2592 (bytes into file)3 ---
> Start of section headers: 2576 (bytes into file)5 19c19
< Number of section headers: 307 ---
> Number of section headers: 289 80,84c80
< 00000000000000fe 0000000000000000 0 0 111 < [28] .symtab SYMTAB 0000000000000000 000011a0
< 0000000000000618 0000000000000018 29 45 813 < [29] .strtab STRTAB 0000000000000000 000017b8
< 00000000000001fd 0000000000000000 0 0 115 ---
> 00000000000000ee 0000000000000000 0 0 1
De-Yu Wang CSIE CYUT 178
21.3. STRIP CHAPTER 21. STRIP 程式
17 165,232d160< Symbol table '.symtab' contains 65 entries:
19 < Num: Value Size Type Bind Vis Ndx Name< 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
21 < 1: 000000000040040c 0 FUNC LOCAL DEFAULT 13call_gmon_start
< 2: 0000000000600700 0 OBJECT LOCAL DEFAULT 18__CTOR_LIST__
23 < 3: 0000000000600710 0 OBJECT LOCAL DEFAULT 19__DTOR_LIST__
< 4: 0000000000600720 0 OBJECT LOCAL DEFAULT 20__JCR_LIST__
25 < 5: 0000000000400430 0 FUNC LOCAL DEFAULT 13__do_global_dtors_aux
< 6: 00000000006008f8 1 OBJECT LOCAL DEFAULT 25 completed.6349
27 < 7: 0000000000600900 8 OBJECT LOCAL DEFAULT 25 dtor_idx.6351
< 8: 00000000004004a0 0 FUNC LOCAL DEFAULT 13 frame_dummy29 < 9: 0000000000600708 0 OBJECT LOCAL DEFAULT 18
__CTOR_END__< 10: 00000000004006f8 0 OBJECT LOCAL DEFAULT 17
__FRAME_END__31 < 11: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_END__
< 12: 00000000004005d0 0 FUNC LOCAL DEFAULT 13__do_global_ctors_aux
33 < 13: 00000000006008ec 4 OBJECT LOCAL DEFAULT 24 i< 14: 0000000000600908 4 OBJECT LOCAL DEFAULT 25 local.2052
35 < 15: 00000000006008c0 0 OBJECT LOCAL DEFAULT 23_GLOBAL_OFFSET_TABLE_
< 16: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_end
37 < 17: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_start
< 18: 0000000000600728 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC39 < 19: 0000000000400200 0 SECTION LOCAL DEFAULT 1
< 20: 000000000040021c 0 SECTION LOCAL DEFAULT 241 < 21: 000000000040023c 0 SECTION LOCAL DEFAULT 3
< 22: 0000000000400260 0 SECTION LOCAL DEFAULT 443 < 23: 0000000000400280 0 SECTION LOCAL DEFAULT 5
< 24: 00000000004002e0 0 SECTION LOCAL DEFAULT 645 < 25: 0000000000400320 0 SECTION LOCAL DEFAULT 7
< 26: 0000000000400328 0 SECTION LOCAL DEFAULT 847 < 27: 0000000000400348 0 SECTION LOCAL DEFAULT 9
< 28: 0000000000400360 0 SECTION LOCAL DEFAULT 1049 < 29: 0000000000400390 0 SECTION LOCAL DEFAULT 11
< 30: 00000000004003a8 0 SECTION LOCAL DEFAULT 1251 < 31: 00000000004003e0 0 SECTION LOCAL DEFAULT 13
< 32: 0000000000400608 0 SECTION LOCAL DEFAULT 1453 < 33: 0000000000400618 0 SECTION LOCAL DEFAULT 15
< 34: 0000000000400634 0 SECTION LOCAL DEFAULT 1655 < 35: 0000000000400660 0 SECTION LOCAL DEFAULT 17
< 36: 0000000000600700 0 SECTION LOCAL DEFAULT 1857 < 37: 0000000000600710 0 SECTION LOCAL DEFAULT 19
< 38: 0000000000600720 0 SECTION LOCAL DEFAULT 20
De-Yu Wang CSIE CYUT 179
21.3. STRIP CHAPTER 21. STRIP 程式
59 < 39: 0000000000600728 0 SECTION LOCAL DEFAULT 21< 40: 00000000006008b8 0 SECTION LOCAL DEFAULT 22
61 < 41: 00000000006008c0 0 SECTION LOCAL DEFAULT 23< 42: 00000000006008e8 0 SECTION LOCAL DEFAULT 24
63 < 43: 00000000006008f8 0 SECTION LOCAL DEFAULT 25< 44: 0000000000000000 0 SECTION LOCAL DEFAULT 26
65 < 45: 00000000006008e8 0 NOTYPE WEAK DEFAULT 24 data_start< 46: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@@GLIBC_2.2.567 < 47: 0000000000400530 2 FUNC GLOBAL DEFAULT 13
__libc_csu_fini< 48: 00000000004003e0 0 FUNC GLOBAL DEFAULT 13 _start
69 < 49: 0000000000000000 0 NOTYPE WEAK DEFAULT UND__gmon_start__
< 50: 0000000000000000 0 NOTYPE WEAK DEFAULT UND_Jv_RegisterClasses
71 < 51: 0000000000400608 0 FUNC GLOBAL DEFAULT 14 _fini< 52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@@GLIBC_73 < 53: 00000000006008f0 4 OBJECT GLOBAL DEFAULT 24 global
< 54: 0000000000400618 4 OBJECT GLOBAL DEFAULT 15_IO_stdin_used
75 < 55: 00000000006008e8 0 NOTYPE GLOBAL DEFAULT 24__data_start
< 56: 0000000000400620 0 OBJECT GLOBAL HIDDEN 15__dso_handle
77 < 57: 0000000000600718 0 OBJECT GLOBAL HIDDEN 19__DTOR_END__
< 58: 0000000000400540 137 FUNC GLOBAL DEFAULT 13__libc_csu_init
79 < 59: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS __bss_start< 60: 0000000000600910 0 NOTYPE GLOBAL DEFAULT ABS _end
81 < 61: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS _edata< 62: 00000000004004c4 27 FUNC GLOBAL DEFAULT 13 inc_func
83 < 63: 00000000004004df 67 FUNC GLOBAL DEFAULT 13 main< 64: 0000000000400390 0 FUNC GLOBAL DEFAULT 11 _init
85 <� �6. 8195 bytes 4368 bytes�
1 [dywang@dyH gcc]$ ll stripex1*-rwxrwxr-x. 1 dywang dywang 4368 Sep 1 08:34 stripex1
3 -rw-rw-r--. 1 dywang dywang 323 Aug 31 22:19 stripex1.c� �
21.3.3 keep-symbol1. 程式�
1 [dywang@dyH gcc]$ gcc -g -o stripex1 stripex1.c[dywang@dyH gcc]$ ll stripex1
3 -rwxrwxr-x. 1 dywang dywang 8195 Sep 1 08:58 stripex1
De-Yu Wang CSIE CYUT 180
21.3. STRIP CHAPTER 21. STRIP 程式
� �2. �
1 [dywang@dyH gcc]$ strip -s -Kstripex1.c stripex1� �3. 75 28
stripex1.c�1
Symbol table '.dynsym' contains 4 entries:3 Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND5 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@GLIBC_2.2.5 (2)2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__7 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)
9 Symbol table '.symtab' contains 28 entries:Num: Value Size Type Bind Vis Ndx Name
11 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 0000000000000000 0 FILE LOCAL DEFAULT ABS stripex1.c
13 2: 0000000000400200 0 SECTION LOCAL DEFAULT 13: 000000000040021c 0 SECTION LOCAL DEFAULT 2
15 4: 000000000040023c 0 SECTION LOCAL DEFAULT 35: 0000000000400260 0 SECTION LOCAL DEFAULT 4
17 6: 0000000000400280 0 SECTION LOCAL DEFAULT 57: 00000000004002e0 0 SECTION LOCAL DEFAULT 6
19 8: 0000000000400320 0 SECTION LOCAL DEFAULT 79: 0000000000400328 0 SECTION LOCAL DEFAULT 8
21 10: 0000000000400348 0 SECTION LOCAL DEFAULT 911: 0000000000400360 0 SECTION LOCAL DEFAULT 10
23 12: 0000000000400390 0 SECTION LOCAL DEFAULT 1113: 00000000004003a8 0 SECTION LOCAL DEFAULT 12
25 14: 00000000004003e0 0 SECTION LOCAL DEFAULT 1315: 0000000000400608 0 SECTION LOCAL DEFAULT 14
27 16: 0000000000400618 0 SECTION LOCAL DEFAULT 1517: 0000000000400634 0 SECTION LOCAL DEFAULT 16
29 18: 0000000000400660 0 SECTION LOCAL DEFAULT 1719: 0000000000600700 0 SECTION LOCAL DEFAULT 18
31 20: 0000000000600710 0 SECTION LOCAL DEFAULT 1921: 0000000000600720 0 SECTION LOCAL DEFAULT 20
33 22: 0000000000600728 0 SECTION LOCAL DEFAULT 2123: 00000000006008b8 0 SECTION LOCAL DEFAULT 22
35 24: 00000000006008c0 0 SECTION LOCAL DEFAULT 2325: 00000000006008e8 0 SECTION LOCAL DEFAULT 24
37 26: 00000000006008f8 0 SECTION LOCAL DEFAULT 2527: 0000000000000000 0 SECTION LOCAL DEFAULT 26� �
De-Yu Wang CSIE CYUT 181
21.3. STRIP CHAPTER 21. STRIP 程式
4. 8195 bytes 5196 bytes�[dywang@dyH gcc]$ ll stripex1
2 -rwxrwxr-x. 1 dywang dywang 5196 Sep 1 09:03 stripex1� �
21.3.4 strip-symbol1. 程式�
[dywang@dyH gcc]$ gcc -g -o stripex1 stripex1.c2 [dywang@dyH gcc]$ ll stripex1
-rwxrwxr-x. 1 dywang dywang 8195 Sep 1 09:08 stripex1� �2. �
1 [dywang@dyH gcc]$ strip -Nstripex1.c stripex1� �3. 75 74 stripex1.c
�1
Symbol table '.dynsym' contains 4 entries:3 Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND5 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
printf@GLIBC_2.2.5 (2)2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__7 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)
9 Symbol table '.symtab' contains 74 entries:Num: Value Size Type Bind Vis Ndx Name
11 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 0000000000400200 0 SECTION LOCAL DEFAULT 1
13 2: 000000000040021c 0 SECTION LOCAL DEFAULT 23: 000000000040023c 0 SECTION LOCAL DEFAULT 3
15 4: 0000000000400260 0 SECTION LOCAL DEFAULT 45: 0000000000400280 0 SECTION LOCAL DEFAULT 5
17 6: 00000000004002e0 0 SECTION LOCAL DEFAULT 67: 0000000000400320 0 SECTION LOCAL DEFAULT 7
19 8: 0000000000400328 0 SECTION LOCAL DEFAULT 89: 0000000000400348 0 SECTION LOCAL DEFAULT 9
21 10: 0000000000400360 0 SECTION LOCAL DEFAULT 1011: 0000000000400390 0 SECTION LOCAL DEFAULT 11
23 12: 00000000004003a8 0 SECTION LOCAL DEFAULT 1213: 00000000004003e0 0 SECTION LOCAL DEFAULT 13
De-Yu Wang CSIE CYUT 182
21.3. STRIP CHAPTER 21. STRIP 程式
25 14: 0000000000400608 0 SECTION LOCAL DEFAULT 1415: 0000000000400618 0 SECTION LOCAL DEFAULT 15
27 16: 0000000000400634 0 SECTION LOCAL DEFAULT 1617: 0000000000400660 0 SECTION LOCAL DEFAULT 17
29 18: 0000000000600700 0 SECTION LOCAL DEFAULT 1819: 0000000000600710 0 SECTION LOCAL DEFAULT 19
31 20: 0000000000600720 0 SECTION LOCAL DEFAULT 2021: 0000000000600728 0 SECTION LOCAL DEFAULT 21
33 22: 00000000006008b8 0 SECTION LOCAL DEFAULT 2223: 00000000006008c0 0 SECTION LOCAL DEFAULT 23
35 24: 00000000006008e8 0 SECTION LOCAL DEFAULT 2425: 00000000006008f8 0 SECTION LOCAL DEFAULT 25
37 26: 0000000000000000 0 SECTION LOCAL DEFAULT 2627: 0000000000000000 0 SECTION LOCAL DEFAULT 27
39 28: 0000000000000000 0 SECTION LOCAL DEFAULT 2829: 0000000000000000 0 SECTION LOCAL DEFAULT 29
41 30: 0000000000000000 0 SECTION LOCAL DEFAULT 3031: 0000000000000000 0 SECTION LOCAL DEFAULT 31
43 32: 0000000000000000 0 SECTION LOCAL DEFAULT 3233: 0000000000000000 0 SECTION LOCAL DEFAULT 33
45 34: 000000000040040c 0 FUNC LOCAL DEFAULT 13call_gmon_start
35: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c47 36: 0000000000600700 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__
37: 0000000000600710 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__49 38: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__
39: 0000000000400430 0 FUNC LOCAL DEFAULT 13__do_global_dtors_aux
51 40: 00000000006008f8 1 OBJECT LOCAL DEFAULT 25 completed.6349
41: 0000000000600900 8 OBJECT LOCAL DEFAULT 25 dtor_idx.635153 42: 00000000004004a0 0 FUNC LOCAL DEFAULT 13 frame_dummy
43: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c55 44: 0000000000600708 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__
45: 00000000004006f8 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__57 46: 0000000000600720 0 OBJECT LOCAL DEFAULT 20 __JCR_END__
47: 00000000004005d0 0 FUNC LOCAL DEFAULT 13__do_global_ctors_aux
59 48: 00000000006008ec 4 OBJECT LOCAL DEFAULT 24 i49: 0000000000600908 4 OBJECT LOCAL DEFAULT 25 local.2052
61 50: 00000000006008c0 0 OBJECT LOCAL DEFAULT 23_GLOBAL_OFFSET_TABLE_
51: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_end
63 52: 00000000006006fc 0 NOTYPE LOCAL DEFAULT 18__init_array_start
53: 0000000000600728 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC65 54: 00000000006008e8 0 NOTYPE WEAK DEFAULT 24 data_start
55: 0000000000000000 0 FUNC GLOBAL DEFAULT UNDprintf@@GLIBC_2.2.5
67 56: 0000000000400530 2 FUNC GLOBAL DEFAULT 13__libc_csu_fini
57: 00000000004003e0 0 FUNC GLOBAL DEFAULT 13 _start69 58: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
__gmon_start__
De-Yu Wang CSIE CYUT 183
21.3. STRIP CHAPTER 21. STRIP 程式
59: 0000000000000000 0 NOTYPE WEAK DEFAULT UND_Jv_RegisterClasses
71 60: 0000000000400608 0 FUNC GLOBAL DEFAULT 14 _fini61: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@@GLIBC_73 62: 00000000006008f0 4 OBJECT GLOBAL DEFAULT 24 global
63: 0000000000400618 4 OBJECT GLOBAL DEFAULT 15_IO_stdin_used
75 64: 00000000006008e8 0 NOTYPE GLOBAL DEFAULT 24 __data_start65: 0000000000400620 0 OBJECT GLOBAL HIDDEN 15 __dso_handle
77 66: 0000000000600718 0 OBJECT GLOBAL HIDDEN 19 __DTOR_END__67: 0000000000400540 137 FUNC GLOBAL DEFAULT 13
__libc_csu_init79 68: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
69: 0000000000600910 0 NOTYPE GLOBAL DEFAULT ABS _end81 70: 00000000006008f4 0 NOTYPE GLOBAL DEFAULT ABS _edata
71: 00000000004004c4 27 FUNC GLOBAL DEFAULT 13 inc_func83 72: 00000000004004df 67 FUNC GLOBAL DEFAULT 13 main
73: 0000000000400390 0 FUNC GLOBAL DEFAULT 11 _init� �4. 8195 bytes 8160 bytes�
[dywang@dyH gcc]$ ll stripex12 -rwxrwxr-x. 1 dywang dywang 8160 Sep 1 09:10 stripex1� �
21.3.5 preserve-dates1. /�
[dywang@dyH gcc]$ stat stripex1 stripex1_stripped2 File: `stripex1'
Size: 8195 Blocks: 24 IO Block: 4096 regular file4 Device: fd03h/64771d Inode: 18142 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 500/ dywang) Gid: ( 500/ dywang)6 Access: 2013-09-01 09:19:35.495806134 +0800
Modify: 2013-09-01 09:18:57.410054071 +08008 Change: 2013-09-01 09:18:57.410054071 +0800
File: `stripex1_stripped'10 Size: 4368 Blocks: 16 IO Block: 4096 regular file
Device: fd03h/64771d Inode: 18144 Links: 112 Access: (0775/-rwxrwxr-x) Uid: ( 500/ dywang) Gid: ( 500/ dywang)
Access: 2013-09-01 09:19:35.495806134 +080014 Modify: 2013-09-01 09:19:35.495806134 +0800
Change: 2013-09-01 09:19:35.495806134 +0800� �2. /�
1 [dywang@dyH gcc]$ strip -p -ostripex1_strippedp stripex1
De-Yu Wang CSIE CYUT 184
21.3. STRIP CHAPTER 21. STRIP 程式
� �3. stripex1_strippedp stripex1 / i
�1 [dywang@dyH gcc]$ stat stripex1 stripex1_stripped
File: `stripex1'3 [dywang@dyH gcc]$ stat stripex1 stripex1_stripped stripex1_strippedp
File: `stripex1'5 Size: 8195 Blocks: 24 IO Block: 4096 regular file
Device: fd03h/64771d Inode: 18142 Links: 17 Access: (0775/-rwxrwxr-x) Uid: ( 500/ dywang) Gid: ( 500/ dywang)
Access: 2013-09-01 09:19:35.495806134 +08009 Modify: 2013-09-01 09:18:57.410054071 +0800
Change: 2013-09-01 09:18:57.410054071 +080011 File: `stripex1_stripped'
Size: 4368 Blocks: 16 IO Block: 4096 regular file13 Device: fd03h/64771d Inode: 18144 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 500/ dywang) Gid: ( 500/ dywang)15 Access: 2013-09-01 09:19:35.495806134 +0800
Modify: 2013-09-01 09:19:35.495806134 +080017 Change: 2013-09-01 09:19:35.495806134 +0800
File: `stripex1_strippedp'19 Size: 4368 Blocks: 16 IO Block: 4096 regular file
Device: fd03h/64771d Inode: 18141 Links: 121 Access: (0775/-rwxrwxr-x) Uid: ( 500/ dywang) Gid: ( 500/ dywang)
Access: 2013-09-01 09:19:35.000000000 +080023 Modify: 2013-09-01 09:18:57.000000000 +0800
Change: 2013-09-01 09:34:19.322931661 +0800� �
De-Yu Wang CSIE CYUT 185
Chapter 22
QtEmbedded porting
22.1 arm
1. Qt Embedded porting on ARM platform
2. arm-linux-gcc�[root@dyH ~]# cd /usr/src
2 [root@dyH src]# wget http://www.friendlyarm.net/dl.php?file=arm-linux-gcc-4.3.2.tgz� �
3. arm-linux-gcc tar usr/local/arm/4.3.2 /arm-linux-gcc�
[root@dyH ~]# cd /2 [dywang@dyH /]$ tar zxvf /usr/src/arm-linux-gcc-4.3.2.tgz
[root@dyH ~]# cd -4 [root@dyH src]# ls /usr/local/arm/
4.3.2� �4. arm-linux-gcc /usr/ local /
usr.local/arm/4.3.2/bin�1 [root@dyH src]# ll /usr/local/arm/4.3.2/
total 203 drwxr-xr-x. 6 root root 4096 Nov 18 2008 arm-none-linux-gnueabi
drwxr-xr-x. 2 root root 4096 Mar 25 2009 bin5 drwxr-xr-x. 3 root root 4096 Nov 18 2008 lib
drwxr-xr-x. 4 root root 4096 Nov 18 2008 libexec7 drwxr-xr-x. 3 root root 4096 Nov 18 2008 share
9 [root@dyH src]# ls /usr/local/arm/4.3.2/binarm-linux-addr2line arm-none-linux-gnueabi-addr2line
11 arm-linux-ar arm-none-linux-gnueabi-ararm-linux-as arm-none-linux-gnueabi-as
186
22.1. ARM CHAPTER 22. QTEMBEDDED PORTING
13 arm-linux-c++ arm-none-linux-gnueabi-c++arm-linux-c++filt arm-none-linux-gnueabi-c++filt
15 arm-linux-cpp arm-none-linux-gnueabi-cpparm-linux-g++ arm-none-linux-gnueabi-g++
17 arm-linux-gcc arm-none-linux-gnueabi-gccarm-linux-gcc-4.3.2 arm-none-linux-gnueabi-gcc-4.3.2
19 arm-linux-gcov arm-none-linux-gnueabi-gcovarm-linux-gdb arm-none-linux-gnueabi-gdb
21 arm-linux-gdbtui arm-none-linux-gnueabi-gdbtuiarm-linux-gprof arm-none-linux-gnueabi-gprof
23 arm-linux-ld arm-none-linux-gnueabi-ldarm-linux-nm arm-none-linux-gnueabi-nm
25 arm-linux-objcopy arm-none-linux-gnueabi-objcopyarm-linux-objdump arm-none-linux-gnueabi-objdump
27 arm-linux-ranlib arm-none-linux-gnueabi-ranlibarm-linux-readelf arm-none-linux-gnueabi-readelf
29 arm-linux-size arm-none-linux-gnueabi-sizearm-linux-sprite arm-none-linux-gnueabi-sprite
31 arm-linux-strings arm-none-linux-gnueabi-stringsarm-linux-strip arm-none-linux-gnueabi-strip� �
5. PATH arm-linux-gcc arm-linux-gcc
�[root@dyH src]# echo $PATH
2 /usr/bin:/bin:/sbin:/usr/sbin:/sbin:/usr/sbin:/root/bin:/root/bin[root@dyH src]# arm-linux-gcc
4 -bash: arm-linux-gcc: command not found� �6. export arm-linux-gcc PATH�
[root@dyH ~]# cd2 [root@dyH ~]# echo $PATH
/usr/bin:/bin:/sbin:/usr/sbin:/sbin:/usr/sbin:/root/bin4 [root@dyH ~]# echo 'export PATH=/usr/local/arm/4.3.2/bin/:$PATH' >> .
bashrc[root@dyH ~]# . .bashrc
6 [root@dyH ~]# echo $PATH/usr/local/arm/4.3.2/bin/:/usr/bin:/bin:/sbin:/usr/sbin:/sbin:/usr/sbin
:/root/bin� �7. arm-linux-gcc�
1 [root@dyH ~]# arm-linux-gccarm-none-linux-gnueabi-gcc: no input files� �
De-Yu Wang CSIE CYUT 187
22.2. QT EMBEDDED CHAPTER 22. QTEMBEDDED PORTING
22.2 Qt embedded
1. x86_64 glibc.i686�[root@dyH ~]# yum install glibc.i686� �
2. qt�1 [root@dyH ~]# yum install qt� �
3. qt source
4. qt-embedded-linux-opensource-src�1 [root@dyH ~]# cd /usr/src
[root@dyH src]# wget http://ftp.heanet.ie/mirrors/trolltech/pub/qt/source/qt-embedded-linux-opensource-src-4.5.3.tar.gz� �
5. qt-embedded-linux-opensource-src�[root@dyH ~]# cd src
2 [dywang@dyH src]$ tar zxvf qt-embedded-linux-opensource-src-4.5.3.tar.gz[root@dyH src]# cd qt-embedded-linux-opensource-src-4.5.3
4 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# lsbin demos include LICENSE.GPL3 qmake
translations6 changes-4.5.3 doc INSTALL LICENSE.LGPL README
config.tests examples LGPL_EXCEPTION.txt mkspecs src8 configure FAQ.txt lib projects.pro tools� �
6. qmake mkspecs/qws/linux-arm-g++/qmake.conf�[root@dyH qt-embedded-linux-opensource-src-4.5.3]# cat mkspecs/qws/linux
-arm-g++/qmake.conf2 #
# qmake configuration for building with arm-linux-g++4 #
6 include(../../common/g++.conf)include(../../common/linux.conf)
8 include(../../common/qws.conf)
10 # modifications to g++.confQMAKE_CC = arm-linux-gcc
12 QMAKE_CXX = arm-linux-g++
De-Yu Wang CSIE CYUT 188
22.2. QT EMBEDDED CHAPTER 22. QTEMBEDDED PORTING
QMAKE_LINK = arm-linux-g++14 QMAKE_LINK_SHLIB = arm-linux-g++
16 # modifications to linux.confQMAKE_AR = arm-linux-ar cqs
18 QMAKE_OBJCOPY = arm-linux-objcopyQMAKE_STRIP = arm-linux-strip
20load(qt_config)� �
7. Makefile�1 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# ll Makefile
ls: cannot access Makefile: No such file or directory3 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# ./configure -embedded
arm \-qt-zlib -qt-libpng -qt-gif -qt-libtiff -qt-libmng -qt-libjpeg -qt-
freetype -no-openssl5
Which edition of Qt do you want to use ?7
Type 'c' if you want to use the Commercial Edition.9 Type 'o' if you want to use the Open Source Edition.
11 o c o Open Source
13This is the Qt for Embedded Linux Open Source Edition.
15You are licensed to use this software under the terms of
17 the Lesser GNU General Public License (LGPL) versions 2.1.You are also licensed to use this software under the terms of
19 the GNU General Public License (GPL) versions 3.
21 Type '3' to view the GNU General Public License version 3.Type 'L' to view the Lesser GNU General Public License version 2.1.
23 Type 'yes' to accept this license offer.Type 'no' to decline this license offer.
25Do you accept the terms of either license? yes yes
27Creating qmake. Please wait...
29 gmake: Nothing to be done for `first'.......
31 ......
33 Qt is now configured for building. Just run 'gmake'.Once everything is built, you must run 'gmake install'.
35 Qt will be installed into /usr/local/Trolltech/QtEmbedded-4.5.3-arm
37 To reconfigure, run 'gmake confclean' and 'configure'.� �De-Yu Wang CSIE CYUT 189
22.3. QT EMBEDDED 程式 CHAPTER 22. QTEMBEDDED PORTING
8. Makefile qmakegmake install /usr/local/Trolltech/QtEmbedded-
4.5.3-arm�1 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# ll Makefile
-rw-r--r--. 1 root root 117564 Sep 8 08:13 Makefile3 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# gmake
[root@dyH qt-embedded-linux-opensource-src-4.5.3]# gmake install� �9. QtEmbedded�
[root@dyH qt-embedded-linux-opensource-src-4.5.3]# ll /usr/local/Trolltech/QtEmbedded-4.5.3-arm
2 total 28drwxr-xr-x. 2 root root 4096 Sep 7 22:37 bin
4 drwxr-xr-x. 18 root root 4096 Sep 7 22:37 demosdrwxr-xr-x. 25 root root 4096 Sep 7 22:37 examples
6 drwxr-xr-x. 14 root root 4096 Sep 7 22:36 includedrwxr-xr-x. 4 root root 4096 Sep 7 22:36 lib
8 drwxr-xr-x. 88 root root 4096 Sep 7 22:37 mkspecsdrwxr-xr-x. 6 root root 4096 Sep 7 22:36 plugins� �
22.3 Qt embedded程式
1. 程式 project�1 [root@dyH qt-embedded-linux-opensource-src-4.5.3]# cd /usr/local/
Trolltech/QtEmbedded-4.5.3-arm/demos/[root@dyH demos]# mkdir hello
3 [root@dyH demos]# cd hello� �2. 程式 hello.cpp�
1 [root@dyH hello]# vim hello.cpp
3 #include <QApplication>#include <QLabel>
5int main(int argc, char *argv[])
7 {QApplication app(argc, argv);
9 QLabel *label = new QLabel("Hello Qt!");label->show();
11 return app.exec();}� �
De-Yu Wang CSIE CYUT 190
22.3. QT EMBEDDED 程式 CHAPTER 22. QTEMBEDDED PORTING
3. proj qmake PATH�[root@dyH hello]# qmake -project
2 -bash: qmake: command not found� �4. qmake PATH�
[root@dyH hello]# ls /usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin/qmake2 /usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin/qmake
[root@dyH hello]# echo "PATH=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin:$PATH" >> ~/.bashrc
4 [root@dyH hello]# . ~/.bashrc[root@dyH hello]# echo $PATH
6 /usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin:/usr/local/arm/4.3.2/bin/:/usr/bin:/bin:/sbin:/usr/sbin:/sbin:/usr/sbin:/root/bin� �
5. qmake proj�1 [root@dyH hello]# qmake -project
[root@dyH hello]# qmake -project3 [root@dyH hello]# ll
total 85 -rw-r--r--. 1 root root 202 Sep 8 09:30 hello.cpp
-rw-r--r--. 1 root root 298 Sep 8 09:39 hello.pro� �6. Makefile�
[root@dyH hello]# qmake hello.pro2 [root@dyH hello]# ll
total 164 -rw-r--r--. 1 root root 202 Sep 8 09:30 hello.cpp
-rw-r--r--. 1 root root 298 Sep 8 09:39 hello.pro6 -rw-r--r--. 1 root root 6437 Sep 8 09:42 Makefile� �
7. make hello�[root@dyH hello]# make
2 arm-linux-g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I../../mkspecs/qws/linux-arm-g++ -I. -I../../include/QtCore -I../../include/QtNetwork -I../../include/QtGui -I../../include -I. -I. -o hello.ohello.cpp
arm-linux-g++ -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib -o hello hello.o -L/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib -lQtGui -L/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib -lQtNetwork -lQtCore -lm -lrt -ldl -lpthread
De-Yu Wang CSIE CYUT 191
22.4. TARGET BOARD CHAPTER 22. QTEMBEDDED PORTING
4 [root@dyH hello]# lltotal 28
6 -rwxr-xr-x. 1 root root 7717 Sep 8 09:44 hello-rw-r--r--. 1 root root 202 Sep 8 09:30 hello.cpp
8 -rw-r--r--. 1 root root 2716 Sep 8 09:44 hello.o-rw-r--r--. 1 root root 298 Sep 8 09:39 hello.pro
10 -rw-r--r--. 1 root root 6437 Sep 8 09:42 Makefile� �8. hello arm�
[root@dyH hello]# ./hello2 -bash: ./hello: cannot execute binary file
[root@dyH hello]# file hello4 hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.14, not stripped� �
22.4 target board
1. QtEmbedded target board�[root@dyH ~]# mkdir -p /media/targetboard/usr/local/Trolltech
2 [root@dyH ~]# cp -a /usr/local/Trolltech/QtEmbedded-4.5.3-arm /media/targetboard/usr/local/Trolltech� �
2. �[root@dyH ~]# vim /media/targetboard/root/armexport.sh
2$ export QTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm
4 $ export PATH=$QTDIR/bin:$PATH$ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH� �
3. armexport.sh�1 [root@dyH ~]# chmod a+x /media/targetboard/root/armexport.sh� �
4.
De-Yu Wang CSIE CYUT 192