wordpress 自定義注冊表單前端seo優(yōu)化
C語言家教記錄(七)
- 導(dǎo)語
- 字符串
- 字面量
- 變量
- 讀寫字符串
- 操作函數(shù)
- 慣用法
- 數(shù)組
- 結(jié)構(gòu)
- 聯(lián)合
- 枚舉
- 總結(jié)與復(fù)習(xí)
導(dǎo)語
本次授課的內(nèi)容如下:字符串,結(jié)構(gòu)體、聯(lián)合體、枚舉
輔助教材為 《C語言程序設(shè)計現(xiàn)代方法(第2版)》
字符串
字面量
雙引號括起來的字符序列
"to be or not to be, is a question"
字面量需要用\來延續(xù)\
printf("When you come to a fork in the road, take it. \
--Yogi Berra");//必須頂格
字面量長度為n,則存儲空間為n+1,字符串也可以為空,用單獨的\0存儲
char*s="abc";//不能修改內(nèi)容
char ch;
ch = "abc"[1];
printf('\n');//非法,只能是字面量
變量
和整數(shù)一樣,也可以用數(shù)組
說明一下數(shù)據(jù)的實際存儲,探討各情況下存儲用的空間
char date1[8] = "June 14";
//等價于
char date1[8] = {'J', 'u', 'n', 'e', ' ', '1', '4', '\0'};
char date2[9] = "June 14";
char date3[7] = "June 14";
char date4[] = "June 14";char *p;
char s[121];
p=str;
讀寫字符串
用printf、scanf控制輸入輸出
char str[] = "Are we having fun yet?";
printf("%s\n", str);
printf("%.6s\n", str);//思考一下會輸出什么
scanf("%s",str);
用gets、puts控制輸出
char s[121];
gets(s);//不知道數(shù)據(jù)長度有風(fēng)險,fgets更好
puts(s);
逐個讀入
int read_line(char str[], int n)
{int ch, i = 0;while ((ch = getchar()) != '\n')if (i < n)str[i++] = ch;str[i] = '\0'; /* terminates string */return i; /* number of characters stored */
}
示例程序
int count_spaces(const char s[])
{int count = 0, i;for (i = 0; s[i] != '\0'; i++)if (s[i] == ' ')count++;return count;
}
操作函數(shù)
strcpy,strlen,strcat,strcmp
strcpy(str2, "abcd");
strcpy(str1, str2);
strcpy(str1, strcpy(str2, "abcd"));int len;
len = strlen("abc"); /* len is now 3 */
len = strlen(""); /* len is now 0 */
strcpy(strl, "abc");
len = strlen(strl);strcpy(str1, "abc");
strcat(str1, "def"); /* str1 now contains "abcdef" */
strcpy(str1, "abc");
strcpy(str2, "def");
strcat(str1, str2);int strcmp(const char *s1, const char *s2);
if (strcmp(str1, str2) < 0)
慣用法
示例程序
size_t strlen(const char *s)
{const char *p = s;while (*s)s++;return s - p;
}{char *p = s1;while (*p)p++;while (*p++ = *s2++);return s1;
}
數(shù)組
探討存儲方式區(qū)別
char planets[][8] = {"Mercury", "Venus", "Earth","Mars", "Jupiter", "Saturn","Uranus", "Neptune", "Pluto"};char *planets[] = {"Mercury", "Venus", "Earth","Mars", "Jupiter", "Saturn","Uranus", "Neptune", "Pluto"};
示例程序
#include <string.h>
#define NUM_PLANETS 9
int main(int argc, char *argv[])
{char *planets[] = {"Mercury", "Venus", "Earth","Mars", "Jupiter", "Saturn","Uranus", "Neptune", "Pluto"};int i, j;for (i = 1; i < argc; i++) {for (j = 0; j < NUM_PLANETS; j++)if (strcmp(argv[i], planets[j]) == 0) {printf("%s is planet %d\n", argv[i], j + 1);break;}if (j == NUM_PLANETS)printf("%s is not a planet\n", argv[i]);}return 0;
}
結(jié)構(gòu)
struct {int number;char name[NAME_LEN+1];int on_hand;
} part1, part2;
//介紹存儲實現(xiàn),視為一整個變量,可以認(rèn)為生成了一個新的類型
struct{
char stu_name[10];
int id;
int grade;
}student;struct {int number;char name[NAME_LEN+1];int on_hand;
} part1 = {528, "Disk drive", 10},part2 = {914, "Printer cable", 5};//初始化,但是不推薦這么用;//通過.運(yùn)算符進(jìn)行訪問,或者用->
printf("Part number: %d\n", part1.number);
printf("Part name: %s\n", part1.name);
printf("Quantity on hand: %d\n", part1.on_hand);Part1.number = 258; /* changes part1's part number */
Part1.on_hand++;scanf("%d", &part1.on_hand);part2 = part1;struct { int a[10]; } a1, a2;
a1 = a2;
命名
struct part {int number;char name[NAME_LEN+1];int on_hand;
};//一個新的類型struct part part1, part2;//不能直接用partstruct part {int number;char name[NAME_LEN+1];int on_hand;
} part1, part2;typedef struct {int number;char name[NAME_LEN+1];int on_hand;
} Part;//這之后可以用Part直接命名
示例程序
struct part build_part(int number, const char * name, int on_hand)
{struct part p;p.number = number;strcpy (p.name, name);p.on_hand = on_hand;return p;
}
part1 = build_part(528, "Disk drive", 10);
其余部分見書
聯(lián)合
解釋一下存儲實現(xiàn)
union {int i;double d;
} u;
union {int i;double d;
} u = {0};
示例程序
#define INT_KIND 0
#define DOUBLE_KIND 1
typedef struct {int kind; /* tag field */union{int i;double d;} u;
} Number;n.kind = INT_KIND;
n.u.i = 82;void print_number(Number n)
{if (n.kind == INT_KIND)printf("%d", n.u.i);elseprintf("%g", n.u.d);
}
枚舉
#define SUIT int
#define CLUBS 0
#define DIAMONDS 1
#define HEARTS 2
#define SPADES 3
enum {CLUBS, DIAMONDS, HEARTS, SPADES} s1, s2;
//等價于
enum suit {CLUBS, DIAMONDS, HEARTS, SPADES};
enum suit s1, s2;
//等價于
typedef enum {CLUBS, DIAMONDS, HEARTS, SPADES} Suit;
Suit s1, s2;//c89中的bool
typedef enum {FALSE, TRUE} Bool;enum suit {CLUBS = 1, DIAMONDS = 2, HEARTS = 3, SPADES = 4};typedef struct {enum {INT_KIND, DOUBLE_KIND} kind;union {int i;double d;} u;
} Number;
總結(jié)與復(fù)習(xí)
本次授課講述第13章和第16章內(nèi)容,關(guān)鍵點:字符串和新類型