Skip to content

Instantly share code, notes, and snippets.

@sunnylost
Created June 19, 2013 17:27
Show Gist options
  • Save sunnylost/5816143 to your computer and use it in GitHub Desktop.
Save sunnylost/5816143 to your computer and use it in GitHub Desktop.
TCPL 习题集 第一章
//超过 80 个字符自动折行。
//折行位置为最近的一个空格,如果没有空格,则从连续文本中断开,加上连字符。
#define MAXLENGTH 80
void newline();
void printArray(char arr[], int pos);
int main(char args[]) {
newline();
}
void newline() {
char line[MAXLENGTH];
int i = 0;
char c;
int pos = -1;
while((c = getchar()) != EOF) {
if(i == MAXLENGTH) { //break point!
if(pos != -1) {
printArray(line, pos + 1);
printf("\n");
i = i - pos;
for(int j = 0; j < i; ++j) {
line[j] = line[pos++];
}
pos = -1;
} else {
printArray(line, MAXLENGTH - 1);
printf("-\n");
i = 1;
line[0] = line[MAXLENGTH - 1];
}
}
if(c == '\n') {
printArray(line, i);
printf("\n");
i = 0;
pos = -1;
} else {
if(c == ' ') {
pos = i;
}
line[i] = c;
++i;
}
}
printArray(line, i);
}
void printArray(char arr[], int pos) {
for(int i = 0; i < pos; ++i) {
printf("%c", arr[i]);
}
}
//忽略注释
#define COMMENT_FIX '/'
#define MULTI_COMMENT '*'
void removeComment();
int main(char args[]) {
removeComment();
}
void removeComment() {
char c;
int begin = 0;
int inComment = 0;
int inMultiComment = 0;
int nearEnd = 0;
while((c = getchar()) != EOF) {
if(inComment == 1 && c != '\n') continue;
if(inMultiComment == 1 && c != MULTI_COMMENT && c != COMMENT_FIX) {
nearEnd = 0;
continue;
}
if(c == COMMENT_FIX) {
if(begin == 1 && inMultiComment != 1) {
inComment = 1;
} else {
if(nearEnd == 1) {
inMultiComment = 0;
} else {
if(inMultiComment != 1) {
begin = 1;
}
}
}
} else if(c == MULTI_COMMENT) {
if(inMultiComment == 1) {
nearEnd = 1;
} else if(begin == 1) {
inMultiComment = 1;
begin = 0;
nearEnd = 0;
} else {
printf("*");
}
} else {
if(begin == 1 && inComment != 1 && inMultiComment != 1) {
printf("/");
}
printf("%c", c);
begin = inComment = nearEnd = 0;
}
}
}
//检查 C 源码中的括号是否匹配。
#include <stdio.h>
#include <string.h>
#define MAXLEVEL 20
char c;
char bracketStack[MAXLEVEL + 1][3];
int currentLevel = -1;
int lineNum;
int columnNum, lastBracketColumn;
int inError = 0;
int inString, inCharacter, inComment, inMultiComment, begin, nearEnd, inEscape;
int lp, rp, ls, rs, lc, rc; //parenthesis - 圆括号; square bracket - 方括号;curly bracket | brace - 花括号
void testLeftBracket();
void testRightBracket();
char tansformBracket(char); //将括号转成对应部分的括号
void showError(char);
int main() {
lineNum = columnNum = 1;
inString = inCharacter = inComment = inMultiComment = begin = nearEnd = inEscape = 0;
lp = rp = ls = rs = lc = rc = 0;
while((c = getchar()) != EOF && !inError) {
columnNum++;
if(inComment && c != '\n') continue;
if(inMultiComment && c != '*' && c != '/') {
if(c == '\n') {
++lineNum;
columnNum = 0;
printf("\n");
} else {
printf(" ");
}
nearEnd = 0;
continue;
}
switch(c) {
case '(':
case '[':
case '{':
if(inString || inCharacter) continue;
testLeftBracket();
break;
case ')':
case ']':
case '}':
if(inString || inCharacter) continue;
testRightBracket();
break;
case '\'':
if(!inString) {
inCharacter = inCharacter ? 0 : 1;
}
break;
case '"':
if(inString) {
if(!inEscape) {
inString = 0;
}
} else {
if(!inEscape) {
inString = 1;
}
}
break;
case '/':
if(begin) {
begin = 0;
inComment = 1;
} else if(inMultiComment && nearEnd) {
inMultiComment = nearEnd = 0;
} else {
begin = 1;
}
continue;
break;
case '*':
if(begin) {
begin = 0;
inMultiComment = 1;
} else if(inMultiComment) {
nearEnd = 1;
} else {
printf("%c", c);
}
continue;
break;
case '\\':
break;
case '\n':
++lineNum;
columnNum = 0;
inComment = 0;
printf("\n");
continue;
break;
default:
if(begin) {
begin = 0;
}
break;
}
printf("%c", c);
}
if(!inError) {
if(currentLevel >= 0) {
showError(tansformBracket(bracketStack[currentLevel][0]));
} else {
printf("\n\n===========SUCCESS==========\n");
printf("There's NO ERROR! HOORAY!");
printf("\n===========SUCCESS END==========");
}
}
}
char tansformBracket(char bracket) {
char result;
switch (bracket) {
case '{':
case '[':
result = bracket + 2;
break;
case '(':
result = bracket + 1;
break;
case ')':
result = bracket - 1;
break;
case ']':
case '}':
result = bracket - 2;
break;
default:
result = ' ';
}
return result;
}
void testLeftBracket() {
++lp;
++currentLevel;
if(currentLevel >= MAXLEVEL) {
inError = 1;
printf("\n The nest is in the MAXIMUM level!");
}
bracketStack[currentLevel][0] = c;
bracketStack[currentLevel][1] = lineNum;
bracketStack[currentLevel][2] = columnNum;
bracketStack[currentLevel + 1][0] = '\0';
lastBracketColumn = columnNum;
}
void testRightBracket() {
char needBracket = ' ';
if(currentLevel == -1) {
bracketStack[currentLevel][0] = c;
bracketStack[currentLevel][1] = lineNum;
bracketStack[currentLevel][2] = columnNum;
return showError(tansformBracket(c));
}
needBracket = tansformBracket(bracketStack[currentLevel][0]);
if(needBracket != c) {
bracketStack[currentLevel][0] = c;
bracketStack[currentLevel][1] = lineNum;
bracketStack[currentLevel][2] = columnNum;
showError(needBracket);
} else {
bracketStack[currentLevel][0] = '\0';
--currentLevel;
if(currentLevel < -1) {
showError(tansformBracket(c));
}
}
}
void showError(char bracket) {
inError = 1;
printf("\n============ERROR============\n");
printf("Require '%c'. ERROR is appeared at LINE %d, Column %d", bracket, bracketStack[currentLevel][1], bracketStack[currentLevel][2]);
printf("\n============ERROR END============\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment