Data_Structure/作業/unit7/tokenization.c
2025-01-20 21:30:53 +08:00

63 lines
2.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Program: tokenization.c (Report comments/bugs to chikh@yuntech.edu.tw)
Function: 輸入運算相關的文字串,從中提取關鍵資訊,為作業的預備暖身
Notes: 輸入可為
w={"Mary":10, "Tom":3, "Charlie":5, "Bob":6, "Dickens":20, 4:9, "z":0, "Za":12, "aZ":8}
del w["Dickens"]
w["Mary"]=1
w["Tom"]+=2
w[4]?
w?
*/
#include <stdio.h> /* for sscanf(), printf() */
#include <string.h> /* for strstr(), strtok(), strtok_r() */
int main()
{
char *token, key[12], line[128];
const char *s = " ={},"; /* 分隔符記的字元 */
int value, i = 0;
char *rest;
printf("\n*** 從字串讀取符記(token)程式 ***\n\n輸入存取字典的陳述,逕按<Enter>結束程式\n");
while (1) {
printf("\n指令 => ");
fgets(line,128,stdin); /* 使用gets()讀取也可以但因gets()未設讀入字元數的限制,可能導致儲存輸入字元的陣列空間爆掉 */
if (line[0]=='\n') break; /* 輸入空字串則跳離此迴圈 */
if (strstr(line,"{")) { /* line含有"{" */
sscanf(line,"w = {%[^}]}",line);
/* printf("大括弧內字串 %s\n",line); */
rest = line;
while (token = strtok_r(rest,s,&rest)) { /* strtok_r()的用法可參見 http://bit.ly/3VcvbbZ */
/* printf("%s\n",token); */
if (strstr(token,":")) {/* token含有":" */
sscanf(token,"%[^:]:%d",key,&value);
printf("Token #%d: 鍵=%s; 值=%d\n",++i,key,value);
}
}
}
else if (strstr(line,"del")) { /* line含有"del" */
sscanf(line,"del w[%[^]]]",key);
printf("刪除運算:鍵=%s\n",key);
}
else if (strstr(line,"+=")) { /* line含有"+=" */
sscanf(line,"w[%[^]]] +=%d",key,&value);
printf("遞增運算:鍵=%s運算元=%d\n",key,value);
}
else if (strstr(line,"=")) { /* line含有"=" */
sscanf(line,"w[%[^]]] = %d",key,&value);
printf("指派運算:鍵=%s; 運算元=%d\n",key,value);
}
else if (sscanf(line,"w[%[^]]]?",key)==1)
printf("讀值運算:鍵=%s\n",key);
else if (strstr(line,"?"))
printf("顯示整個字典內容(請同學實作,此為作業的一部分)\n");
else
printf("語法無法辨認sorry!\n");
}
printf("\n程式結束bye ~\n");
return 0;
}