首页 > 代码库 > 你真的了解C中的声明吗 —— 简版dcl程序
你真的了解C中的声明吗 —— 简版dcl程序
小测试看看你理解对几个:char **argv argv: pointer to char array int (*daytab)[13] daytab: pointer to array[13] of intint *daytab[13] daytab: array[13] of pointer to intvoid *comp() comp: function returning pointer to voidvoid (*comp)() comp: pointer to function returning voidchar (*(*x())[])() x: function returning pointer to array[] of pointer to function returning charchar (*(*x[3])())[5] x: array[3] of pointer to function returning pointer to array[5] of char-----------------------------------------------------------------------------------------------------------------------------------/* dcl: parse a declarator */void dcl(void){ int ns; for (ns = 0; gettoken() == ‘*‘; ) /* count *‘s */ ns++; dirdcl(); while (ns-- > 0) strcat(out, " pointer to");}/* dirdcl: parse a direct declarator */void dirdcl(void){ int type; if (tokentype == ‘(‘) { /* ( dcl ) */ dcl(); if (tokentype != ‘)‘) printf("error: missing )\n"); } else if (tokentype == NAME) /* variable name */ strcpy(name, token); else printf("error: expected name or (dcl)\n"); while ((type=gettoken()) == PARENS || type == BRACKETS) if (type == PARENS) strcat(out, " function returning"); else { strcat(out, " array"); strcat(out, token); strcat(out, " of"); }} #include <stdio.h>#include <string.h>#include <ctype.h>#define MAXTOKEN 100 enum { NAME, PARENS, BRACKETS };void dcl(void);void dirdcl(void);int gettoken(void);int tokentype;/*type of last token */char token[MAXTOKEN];/*last token string */char name[MAXTOKEN];/*identifier name */char datatype[MAXTOKEN];/*data type = char, int, etc. */char out[1000];main() /* convert declaration to words */{ while (gettoken() != EOF) { /* 1st token on line */ strcpy(datatype, token); /* is the datatype */ out[0] = ‘\0‘; dcl(); /* parse rest of line */ if (tokentype != ‘\n‘) printf("syntax error\n"); printf("%s: %s %s\n", name, out, datatype); } return 0;} int gettoken(void) /* return next token */{ int c, getch(void); void ungetch(int); char *p = token; while ((c = getch()) == ‘ ‘ || c == ‘\t‘) ; if (c == ‘(‘) { if ((c = getch()) == ‘)‘) { strcpy(token, "()"); return tokentype = PARENS; } else { ungetch(c); return tokentype = ‘(‘; } } else if (c == ‘[‘) { for (*p++ = c; (*p++ = getch()) != ‘]‘; ) ; *p = ‘\0‘; return tokentype = BRACKETS; } else if (isalpha(c)) { for (*p++ = c; isalnum(c = getch()); ) *p++ = c; *p = ‘\0‘; ungetch(c); return tokentype = NAME; } else return tokentype = c;}
你真的了解C中的声明吗 —— 简版dcl程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。