Created
June 19, 2013 17:27
-
-
Save sunnylost/5816143 to your computer and use it in GitHub Desktop.
TCPL 习题集 第一章
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//超过 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]); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//忽略注释 | |
#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; | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//检查 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