【原创】自制编程语言-2 添加新功能
现在我们可以添加一些新功能了。首先,我们现在的print无法输出换行,所以,我们需要增加一个转义字符\n来进行换行。
else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){
for(int i=1;i<strlen(s)-1;i++){
if(s[i]=='\\' && s[i+1]=='n'){
printf("\n");i++;
}
else printf("%c",s[i]);
}
}
如果当前字符为\并且下一个字符为n,那么进行换行,i++的目的是跳过下一个字符,否则会输出n。
我们使用下面的代码对我们的程序进行调试。
print "hello\n"
print 123456
exit
结果很成功。
接下来,我们上次还有一个问题还没有解决,那就是空格的问题。事实上,我们可以用gets(s)代替。gets的作用是读入一整行。
if(strcmp(s,"print")==0){//调用print输出
gets(s);
...
但是需要说明一个问题。新版本的C++编译器去掉了gets函数,因为不安全,可能会数组越界。部分编译器或许还会保留这个函数,但是不是每个编译器都通用的。所以,最好的方式是用fgets(s,字符串长度,stdin)代替。fgets是从文件读入,这里用stdin表示从标准输入来读入。
好了,我们来运行一下试试...???为什么是error?这里要注意,fgets会在最后添上一个'\n',导致输入的时候字符串以'\n'结尾,会出错。(末字符不是")
所以,我们进行输入之后,需要对输入进行处理,但这样做太麻烦了,我们干脆自制一个fgets好了。
void get_string(char *s){
int i;
for(i=0;i<100;i++){
s[i]=getchar();
if(s[i]=='\n')break;//换行停止
}
s[i]='\0';//结束掉字符串
}
这次应该行了...???怎么还是不行?我们用个巧办法吧。
if(strcmp(s,"print")==0){//调用print输出
get_string(s);
/*if(isnumber(s))*/cout<<s;
/*else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){
for(int i=1;i<strlen(s)-1;i++){
if(s[i]=='\\' && s[i+1]=='n'){
printf("\n");i++;
}
else printf("%c",s[i]);
}
}
else error();*/
}
我们不管三七二十一,先直接输入字符串,然后再看看问题所在。
print "hello\n"
print 123456
exit
输出结果:
"hello\n" 123456
注意到了没有?两个东西之前都有空格。所以,下一步,我们需要对空格进行控制。
void get_string(char *s){
int i=0,flag=0;
for(i=0;i<100;i++){
next:
s[i]=getchar();
if(flag==0 && s[i]==' ')goto next;
else flag=1;
if(s[i]=='\n')break;
}
s[i]='\0';//结束掉字符串
}
这样就可以了。
对这段代码做一下解释。flag是一个标志,说明现在进行到了字符串的哪里,如果flag=0说明在开头,此时如果读到空格需要重新读入(因为要过滤掉一开始的空格);如果flag=1说明不在开头。读到第一个不为空格的字符说明不在开头,可以把这个空格读进来,顺便把flag的状态切换为1.
当然,我自己认为这个代码的风格还不算很好,毕竟使用到了goto和flag这个变量。各位读者也可以尝试自己改进这个代码,使得代码更加简洁。
这一篇就讲到这里,下一篇我们就尝试讲讲变量了。