大家好,我来了,我是萌杰尔
前段时间,我想实现一个命令行工具(相似cmd.exe那种的),于是捡起了万年不必的C语言,写起了输入输出。
问题就出在这里了,我用的scanf函数不承受空字符,只有我不输出货色,按回车还是无奈完结,这我能忍???
作为一个在计算机这块混了八年的混子,我必定有我的方法,可能不肯定好,然而能够解决当下的这个问题。
我想,很多敌人曾经晓得怎么办了,然而还是有些萌新遇到这种问题不晓得如何解决,那我明天就来讲一讲吧。
解题思路
我的思路是应用一个循环,通过getchar函数继续一直的接管字符,而后把字符存储到字符串中。
说干就干,昨天晚上我花了一点工夫实现这个性能,上面展现一下我的代码。
#include <stdio.h>#include <string.h>int main(int argc, char const *argv[]){ //外层循环,让程序每次执行完一个命令就返回到初始中央从新输出命令 while (1) { //命令字符串 char command[128]; //累加器,示意以后输出的字符对应命令字符串中的下标 int scannerIndex = 0; //清空命令字符串(防止缓冲区问题) memset(command, 0, sizeof(command)); //打印Command printf("Command > "); //里层循环,接管字符 while (1) { //接管字符临时存储地位 char buff = getchar(); //判断该字符是否为回车,如果是,就让累加器归零并且退出循环 if (buff == '\n') { scannerIndex = 0; break; } //如果不是,就将输出的字符保留到命令字符串中 command[scannerIndex] = buff; //累加器的值减少 scannerIndex++; } //判断命令是否为空,如果为空,让循环进行从新执行 if (strlen(command) == 0) continue; //这上面能够开始写命令操作的内容了 //Code Here } return 0;}
执行后果如下
能够看到当我留空时会间接从新执行,解决了scanf的问题。
我是那种更文只更到一半的人吗?当然不是,那么咱们持续实现这个Command程序。
接下来我要减少一个宰割命令名称和参数的性能,与cmd和其余泛滥命令行工具一样,该命令行的命令和参数也是通过空格分隔开来,那就好办了,我在这里举个栗子,我的命令只有一个参数,比方echo命令,我只须要输入第一个参数即可。
那么我就来写一下宰割命令的代码。
//因为strtok这个宰割字符串的函数会毁坏原始字符串,所以这里我从新申明一个buff字符串char buff[128];//清空buff字符串memset(buff, 0, sizeof(buff));//将command字符串中的内容复制给buff字符串strcpy(buff, command);//申明key,value字符串。key时命令,value是参数。char key[64], value[64];//清空key字符串memset(key, 0, sizeof(key));//清空value字符串memset(value, 0, sizeof(value));//截取' '(空格)之前的内容给keystrcpy(key, strtok(buff, " "));//截取' '(空格)之后的内容给value,strtok函数第一个参数留空是接着上一次的持续截取strcpy(value, strtok(NULL, " "));
到这里,其实咱们曾经把命令和参数别离保留到key和value中了
那么我就能够开始判断这是个什么命令,程序应该怎么做。
其实很简略,从这里开始就是if-else之类的了
//如果命令是echo,输入参数if (!strcmp(key, "echo")){ printf("%s\n", value);//如果命令是list,输入“该命令正在开发中”} else if (!strcmp(key, "list")){ printf("This command is developing!\n");//如果都不是,输入“谬误的命令”} else{ printf("Error command!\n");}
下面的都写完之后,咱们能够编译,执行该源码,最终失去的后果应该是如下的
如上图,当我输出echo hello的时候程序输入了hello
输出list .\的时候输入This command is developing!
出入其余命令则输入Error command!
最终源码展现
#include <stdio.h>#include <string.h>int main(int argc, char const *argv[]){ while (1) { char command[128]; int scannerIndex = 0; memset(command, 0, sizeof(command)); printf("Command > "); while (1) { char buff = getchar(); if (buff == '\n') { scannerIndex = 0; break; } command[scannerIndex] = buff; scannerIndex++; } if (strlen(command) == 0) continue; //Code Here /*** * splice the command * key: command * value: argument **/ char buff[128]; memset(buff, 0, sizeof(buff)); strcpy(buff, command); char key[64], value[64]; memset(key, 0, sizeof(key)); memset(value, 0, sizeof(value)); strcpy(key, strtok(buff, " ")); strcpy(value, strtok(NULL, " ")); /*** * run command **/ if (!strcmp(key, "echo")) { printf("%s\n", value); } else if (!strcmp(key, "list")) { printf("This command is developing!\n"); } else { printf("Error command!\n"); } } return 0;}
感激大家浏览我的文章,如果你有其余的观点或思路,能够在我的文章上面评论哦
我的微信群,欢送大家退出