从命令行拆分和保存用户输入

时间:2019-06-14 17:18:57

标签: c string parsing input split

我必须编写一个包含不同命令的程序,例如:“注册用户名密码”,“登录用户名密码”,“ del_user用户名”。我想从命令行逐行读取命令。识别它们,并分开单词,计算每行中单词的数量,并使用它们(例如用户名和密码)作为某些功能的输入。

如何读取c中的一行? 如何拆分和保存每一行的单词?

我尝试使用scanf,gets等读取输入。

2 个答案:

答案 0 :(得分:0)

使用fgets阅读每一行。
仅包含少量项目,请尝试解析最大项目。 sscanf将返回已解析的项目数。根据扫描的项目数和匹配命令进行处理。

#include <stdio.h>
#include <string.h>

int main ( void) {
    char line[100] = "";
    char command[100] = "";
    char name[100] = "";
    char pw[100] = "";
    char extra[100] = "";
    int result = 0;

    while ( fgets ( line, sizeof line, stdin)) {
        result = sscanf ( line, "%99s%99s%99s%99s", command, name, pw, extra);
        if ( 2 == result) {
            if ( ! strcmp ( "del_user", command)) {
                //process name to del_user
            }
        }
        if ( 3 == result) {
            if ( ! strcmp ( "signup", command)) {
                //process name pw to signup
            }
            if ( ! strcmp ( "login", command)) {
                //process name pw to login
            }
        }
    }

    return 0;
}

答案 1 :(得分:0)

您可以执行以下操作:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    int x,i,j,length;
    printf("Enter the number of names you want to sort.\n");
    scanf("%d",&x);
    char *names[x],*p,name[50],*t;
    printf("Enter the names:\n");
    for(i=0;i<x;i++)
    {
        scanf(" %[^\n]",name);
        length = strlen(name);
        p = (char *)malloc(length+1);
        strcpy(p,name);
        names[i] = p;
    }
    printf("Entered names are:\n\n");
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    printf("\n\nThe sorted names are:\n");
    for(i=0;i<x-1;i++)
    {

        for(j=i+1;j<x;j++)
        {
            if(strcmp(names[i],names[j])>0)
            {
                strcpy(t,names[i]);
                strcpy(names[i],names[j]);
                strcpy(names[j],t);
            }
        }    
    }
    for(i=0;i<x;i++)
    {
        printf("%s\n",names[i]);
    }
    return 0;
}

演示

enter image description here