本文目錄一覽:
- 1、請問一下C語言關於棧的基本應用
- 2、C語言怎樣判斷合法轉義字符
- 3、C語言中如何判斷是不是合法轉義字符?
- 4、C語言 p=abc\078a\001b q=123\087\123\n 輸出strlen分別為多
請問一下C語言關於棧的基本應用
#include stdlib.h
010 #include malloc.h
011 #include memory.h
012 #include assert.h
/*————————————————————
12 // 棧結構的定義
13 ————————————————————*/
14 typedef struct Stack
15 {
16 ElemType *base; // 棧基址
17 ElemType *top; // 棧頂
18 int stacksize; // 棧存儲空間的尺寸
19 } SqStack;
20
21 /*————————————————————
22 // 棧的基本操作
23 ————————————————————*/
24
25 bool InitStack(SqStack *S);
26 void DestroyStack(SqStack *S);
27 bool StackEmpty(SqStack S);
28 int StackLength(SqStack S);
29 bool GetTop(SqStack S, ElemType *e);
30 void StackTraverse(SqStack S, void (*fp)(ElemType));
31 bool Push(SqStack *S, ElemType e);
32 bool Pop(SqStack *S, ElemType *e);
33 bool bracketMatch(SqStack *S,const char *arr);
const int STACK_INIT_SIZE = 100; // 初始分配的長度
016 const int STACKINCREMENT = 10; // 分配內存的增量
017
018 /*————————————————————
019 操作目的: 初始化棧
020 初始條件: 無
021 操作結果: 構造一個空的棧
022 函數參數:
023 SqStack *S 待初始化的棧
024 返回值:
025 bool 操作是否成功
026 ————————————————————*/
027 bool InitStack(SqStack *S)
028 {
029 S-base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType));
030 if(S -base == NULL)
031 return false;
032 S -top = S -base;
033 S-stacksize = STACK_INIT_SIZE;
034 return true;
035 }
036
037 /*————————————————————
038 操作目的: 銷毀棧
039 初始條件: 棧S已存在
040 操作結果: 銷毀棧S
041 函數參數:
042 SqStack *S 待銷毀的棧
043 返回值:
044 無
045 ————————————————————*/
046 void DestroyStack(SqStack *S)
047 {
048 assert(S != NULL);
049 free(S -base);
050 S-base = S-top = NULL;
051 }
052
053 /*————————————————————
054 操作目的: 判斷棧是否為空
055 初始條件: 棧S已存在
056 操作結果: 若S為空棧,則返回true,否則返回false
057 函數參數:
058 SqStack S 待判斷的棧
059 返回值:
060 bool 是否為空
061 ————————————————————*/
062 bool StackEmpty(SqStack S)
063 {
064 assert((S.base != NULL)(S.top != NULL));
065 return (S.base == S.top);
066 }
067
068 /*————————————————————
069 操作目的: 得到棧的長度
070 初始條件: 棧S已存在
071 操作結果: 返回S中數據元素的個數
072 函數參數:
073 SqStack S 棧S
074 返回值:
075 int 數據元素的個數
076 ————————————————————*/
077 int StackLength(SqStack S)
078 {
079 assert((S.base != NULL)(S.top != NULL));
080 return (S.top – S.base);
081 }
082
083 /*————————————————————
084 操作目的: 得到棧頂元素
085 初始條件: 棧S已存在
086 操作結果: 用e返回棧頂元素
087 函數參數:
088 SqStack S 棧S
089 ElemType *e 棧頂元素的值
090 返回值:
091 bool 操作是否成功
092 ————————————————————*/
093 bool GetTop(SqStack S, ElemType *e)
094 {
095 assert((S.base != NULL) (S.top != NULL));
096 if(S.top == S.base)
097 exit(0);
098 *e = *(S.top – 1);
099 return true;
100 }
101
102 /*————————————————————
103 操作目的: 遍歷棧
104 初始條件: 棧S已存在
105 操作結果: 依次對S的每個元素調用函數fp
106 函數參數:
107 SqStack S 棧S
108 void (*fp)() 訪問每個數據元素的函數指針
109 返回值:
110 無
111 ————————————————————*/
112 void StackTraverse(SqStack S, void (*fp)(ElemType))
113 {
114 assert((S.base != NULL) (S.top != NULL));
115 while(S.base S.top)
116 {
117 (*fp)(*S.base);
118 S.base++;
119 }
120 }
121
122 /*————————————————————
123 操作目的: 壓棧——插入元素e為新的棧頂元素
124 初始條件: 棧S已存在
125 操作結果: 插入數據元素e作為新的棧頂
126 函數參數:
127 SqStack *S 棧S
128 ElemType e 待插入的數據元素
129 返回值:
130 bool 操作是否成功
131 ————————————————————*/
132 bool Push(SqStack *S, ElemType e)
133 {
134 if(S == NULL)
135 return false;
136 assert((S-base != NULL) (S -top != NULL));
137 if(S -top – S -base = S-stacksize)
138 {
139 S -base = (ElemType *)realloc(S -base,(S -stacksize + STACKINCREMENT) * sizeof(ElemType));
140 if(! S -base)
141 exit(0);
142 S -top = S-base + S -stacksize;
143 S -stacksize += STACKINCREMENT;
144 }
145 *(S -top++) = e;
146 return true;
147 }
148
149 /*————————————————————
150 操作目的: 彈棧——刪除棧頂元素
151 初始條件: 棧S已存在且非空
152 操作結果: 刪除S的棧頂元素,並用e返回其值
153 函數參數:
154 SqStack *S 棧S
155 ElemType *e 被刪除的數據元素值
156 返回值:
157 bool 操作是否成功
158 ————————————————————*/
159 bool Pop(SqStack *S, ElemType *e)
160 {
161 if((* S).top == (*S).base)
162 return false;
163 *e = * –(* S).top;
164 return true;
165 }
C語言怎樣判斷合法轉義字符
‘\0’是八進制的轉移字符,如果看到:\087這就是非法的,’\0x’表示十六進制,還有一些必備的如:’\n’,’\r’這些。
和普通的字符判斷相同,比如判斷和’a’是否相同,ch==’a’,那麼判斷轉義一樣,如ch==’\n’,邏輯表達式的結果只有兩個,true和false,所有的邏輯表達式都一樣,為真就是true,否則就是false。
#includestdio.h
int main(){
char a[20]=”abc\’efgh”;
int i=0;
for(i=0;i20;i++){
if(a[i]==’\\’a[i+1]==’\”)
printf(“true,%d”,i);
if(a[i]==’\”)
printf(“false”);
if(a[i]==0){
printf(“%d”,i);
break;
擴展資料:
轉義序列通常有兩種功能。第一個是編碼一個句法上的實體,如設備命令或者無法被字母表直接表示的特殊數據。第二種功能,也叫字符引用,用於表示無法在當前上下文中被鍵盤錄入的字符(如字符串中的回車符),或者在當前上下文中會有不期望的含義的字符(如C語言字符串中的雙引號字符”,不能直接出現,必須用轉義序列表示)。
在後面那種情況,轉義序列是一種由轉義字符自身和一個被引用的字符組成的一個二合字母(digraph)情形。
參考資料來源:百度百科-轉義字符
C語言中如何判斷是不是合法轉義字符?
‘\0’是八進制的轉移字符,如果看到:\087這就是非法的,’\0x’表示十六進制,還有一些必備的如:’\n’,’\r’這些。
和普通的字符判斷相同,比如判斷和’a’是否相同,ch==’a’,那麼判斷轉義一樣,如ch==’\n’,邏輯表達式的結果只有兩個,true和false,所有的邏輯表達式都一樣,為真就是true,否則就是false。
#includestdio.h
int main(){
char a[20]=”abc\’efgh”;
int i=0;
for(i=0;i20;i++){
if(a[i]==’\\’a[i+1]==’\”)
printf(“true,%d”,i);
if(a[i]==’\”)
printf(“false”);
if(a[i]==0){
printf(“%d”,i);
break;
數據類型關鍵字
short:修飾int,短整型數據,可省略被修飾的int。(KR時期引入)
long:修飾int,長整型數據,可省略被修飾的int。(KR時期引入)
long long:修飾int,超長整型數據,可省略被修飾的int。(C99標準新增)
signed:修飾整型數據,有符號數據類型。(C89標準新增)
unsigned:修飾整型數據,無符號數據類型。(KR時期引入)
restrict:用於限定和約束指針,並表明指針是訪問一個數據對象的初始且唯一的方式。(C99標準新增)
複雜類型關鍵字
struct:結構體聲明。(KR時期引入)
union:聯合體聲明。(KR時期引入)
enum:枚舉聲明。(C89標準新增)
typedef:聲明類型別名。(KR時期引入)
sizeof:得到特定類型或特定類型變量的大小。(KR時期引入)
inline:內聯函數用於取代宏定義,會在任何調用它的地方展開。(C99標準新增)
C語言 p=abc\078a\001b q=123\087\123\n 輸出strlen分別為多
結果是8和3
分析
strlen 函數的原理是,遇到’\0′ 空字符 就認為字符串結束
分析p
abc
\07是八進制數,為一個字符 ‘\a’,代表 滴滴聲
8
a
\001
b
共8個
分析q
123
\0 空字符
故只有3
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/309912.html