关于c:C语言之拒绝scanf从我做起

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

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

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理