分享

【原创】自制编程语言-2 添加新功能

 计算机知识杂谈 2021-06-01

现在我们可以添加一些新功能了。首先,我们现在的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这个变量。各位读者也可以尝试自己改进这个代码,使得代码更加简洁。

这一篇就讲到这里,下一篇我们就尝试讲讲变量了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多