几天前网上看到一篇用Java写的打印自己源代码的程序,感觉挺有意思,于是写了一个C语言打印自己的程序。所谓打印自己,就是不是通过打开源代码文件,而是代码的目的就是打印出和源代码一样的字符来。
这是我写的:
#include
#include
static char *stats[100];
static int count=0;
char *convert(char *str)
{
int len = strlen(str);
char *newStr = new char[len+100];
int i=0, j=0;
while(i<=len)
{
if (str[i] == 34)
{
newStr[j] = 92; newStr[j+1] = 34;
i++; j+=2;
}
else
{
newStr[j] = str[i];
i++; j++;
}
}
return newStr;
}
void p1(char *str)
{
stats[count++] = convert(str);
printf("%s%c", str, 10);
}
void p2()
{
for(int i=0; i {
printf("p1(%c%s%c);%c", 34, stats[i], 34, 10);
}
printf(" p2();%c", 10);
printf("}%c", 10);
}
int main()
{
p1("#include ");
p1("#include ");
p1("static char *stats[100];");
p1("static int count=0;");
p1("char *convert(char *str)");
p1("{");
p1(" int len = strlen(str);");
p1(" char *newStr = new char[len+100];");
p1(" int i=0, j=0;");
p1(" while(i<=len)");
p1(" {");
p1(" if (str[i] == 34)");
p1(" {");
p1(" newStr[j] = 92; newStr[j+1] = 34;");
p1(" i++; j+=2;");
p1(" }");
p1(" else");
p1(" {");
p1(" newStr[j] = str[i];");
p1(" i++; j++;");
p1(" }");
p1(" }");
p1(" return newStr;");
p1("}");
p1("void p1(char *str)");
p1("{");
p1(" stats[count++] = convert(str);");
p1(" printf(/"%s%c/", str, 10);");
p1("}");
p1("void p2()");
p1("{");
p1(" for(int i=0; i p1(" {");
p1(" printf(/"p1(%c%s%c);%c/", 34, stats[i], 34, 10);");
p1(" }");
p1(" printf(/" p2();%c/", 10);");
p1(" printf(/"}%c/", 10);");
p1("}");
p1("int main()");
p1("{");
p2();
}
不料,今天在网上看到某强人写的,才知道可以更加简洁搞定
#include
int main()
{
char *p ="#include %c int main(){char *p=%c%s%c; printf(p, 10, 34, p, 34);}";
printf(p, 10, 34, p, 34);
}
后一个程序要简洁漂亮得多了