大家好,我来了,我是萌杰尔

前段时间,我想实现一个命令行工具(相似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;}

感激大家浏览我的文章,如果你有其余的观点或思路,能够在我的文章上面评论哦

我的微信群,欢送大家退出