大家好,我来了,我是萌杰尔
前段时间,我想实现一个命令行工具(相似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));
//截取' '(空格)之前的内容给key
strcpy(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;
}
感激大家浏览我的文章,如果你有其余的观点或思路,能够在我的文章上面评论哦
我的微信群,欢送大家退出
发表回复