Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 首次读取后,程序执行未在scanf()处停止_C++_String_Enums - Fatal编程技术网

C++ 首次读取后,程序执行未在scanf()处停止

C++ 首次读取后,程序执行未在scanf()处停止,c++,string,enums,C++,String,Enums,我希望在do-while()循环的每次迭代中,程序都会在scanf()函数处停止,但程序循环的次数与读取字符串在再次在scanf()处停止之前包含的空格数相同 enum Comando { 阿尤达, 登录, 注销, 利斯塔鲁巴士公司, LISTAR_RUTAS, LISTAR_VIAJES, NULL_命令 }; //注册公司的职能是制定一个项目 成对过程arcomando(char-comandoentro[20]); void MostrarAyuda(); int main() { boo

我希望在do-while()循环的每次迭代中,程序都会在scanf()函数处停止,但程序循环的次数与读取字符串在再次在scanf()处停止之前包含的空格数相同

enum Comando
{
阿尤达,
登录,
注销,
利斯塔鲁巴士公司,
LISTAR_RUTAS,
LISTAR_VIAJES,
NULL_命令
};
//注册公司的职能是制定一个项目
成对过程arcomando(char-comandoentro[20]);
void MostrarAyuda();
int main()
{
bool-salir=false;
char comando[20];
Comando cmd;
做
{
printf(“\n\t$”);
scanf(“%s”,comando);
cmd=ProcesarComando(comando)。第一;
开关(cmd)
{
阿尤达案:
打破
案例登录:
打破
案例注销:
打破
案例列表(巴士):
打破
案例列表:
打破
LISTAR_VIAJES案:
打破
case NULL_命令:
打破
}
}
而(!salir);
//系统(“暂停”);
返回0;
}
配对过程arcomando(char-comandoentro[20])
{
int pos=0;
char*argumento,*comandonomber;
bool-tieneParametros=false;
对号;
argumento=新字符[20];
而(ComandoEntro[pos]!='\0')
{

如果(CundOntoo[PoS]==‘P<)我在这里发布一个C++代码的正确实现。我知道代码不只是答案。但是,这里我没有太多的事情要告诉你。你需要自己检查你所缺乏知识的东西。更好地在这方面搜索。

#包括
#包括
#包括
#包括
#包括
#包括
#包括
科曼多伯爵酒店{
阿尤达,
登录,
注销,
利斯塔鲁巴士公司,
LISTAR_RUTAS,
LISTAR_VIAJES,
NULL_命令
};
自动处理命令(标准::字符串COMANDOENTRO){
std::字符串参数,comandoNombre;
bool-tieneParametros=false;
std::队列编号;
用于(自动和输入:ComandoEntro)

如果(i=='@S.M.,它正在打印相同的输出
,而(!sair);
则发布的代码将运行一个无限循环,因为
sair
在循环内从未更改。请发布真实代码,包括
Comando
AYUDA
等的定义。(a)测试
scanf()返回的值
-如果不是
1
,您就有问题了。(b)通过
scanf()
打印
comando
中设置的值。在调用
procesarcando()之前,使用
printf(“comando=[%s]\n],comando);
。这将为您提供有关正在发生的事情的信息。您需要知道您正在学习和编程的语言。表示法
pair ProcesarComando(char-comandoeintero[20])为什么,你会把C++代码标记成C++?不要忘记用新行完成打印操作。如果你不这样做,行缓冲会留下最后一个不完整的行,直到你添加了一个换行符。假设屏幕截图中的第一行“ayuda\n”
是您在提示时输入的内容,
scanf
将解析为字符串
“ayuda”
,后跟5个相同的字符串
“你的答案非常有用,谢谢帮助和回答,问题是我不适合使用字符串类型!自从我开始上大学,大家都告诉我,如果我在C++中使用那个字符串类型,将来会给我带来很多问题,因为它没有像char那样的灵活性。或者Car *@ DACARAMO我用C++来处理过去5-6年。而且几乎从一开始我就使用String类。直到我没有一个字符串无法解决的问题。<代码> STD::String 是现代C++的一个组成部分,说它引起问题是一个业余评论。好,这取决于你想要使用什么。不使用字符串只会使代码变长,编码效率降低。快乐编码:)你完全正确,我会接受你的答案,因为我害怕在大学里使用它,因为我的老师告诉我不要使用字符串类型……关于我的问题,我想出来了,我用STD::String,它是现代C++中一个非常强大和有用的类。所以我会一直使用它在我的C++中。谢谢你的实施,我发现解决问题非常有用。
enum Comando
{
    AYUDA,
    LOGIN,
    LOGOUT,
    LISTAR_BUSES,
    LISTAR_RUTAS,
    LISTAR_VIAJES, 
    NULL_COMMAND 
};

//Funcion que registra el comando ingresado por el usuario para indicarle al programa que es lo que debe hacer
pair<Comando, queue<char*>> ProcesarComando(char comandoEntero[20]);
void MostrarAyuda();

int main()
{
    bool salir = false;
    char comando[20];
    Comando cmd;

    do
    {
        printf("\n\t$ ");
        scanf(" %s", comando);

        cmd = ProcesarComando(comando).first;

        switch(cmd)
        {
            case AYUDA:

            break;
            case LOGIN:

            break;
            case LOGOUT:

            break;
            case LISTAR_BUSES:

            break;
            case LISTAR_RUTAS:

            break;
            case LISTAR_VIAJES:

            break; 
            case NULL_COMMAND:

            break;           
        }
    }
    while(!salir);

    //system("pause");
    return 0;
}

pair<Comando, queue<char*>> ProcesarComando(char comandoEntero[20])
{
    int pos = 0;
    char *argumento, *comandoNombre;
    bool tieneParametros = false;
    pair<Comando, queue<char*>> retorno;

    argumento = new char[20];
    
    while(comandoEntero[pos] != '\0')
    {
        if(comandoEntero[pos] == '<'|| comandoEntero[pos] == '[')
        {
            tieneParametros = true;
        }
        else if(tieneParametros && comandoEntero[pos] != ' ' && comandoEntero[pos] != '<' && comandoEntero[pos] != '>' && comandoEntero[pos] != '[' && comandoEntero[pos] != ']')
        {
            strncat(argumento, &comandoEntero[pos], 1);
        }
        else if(tieneParametros && comandoEntero[pos] == ' ')
        {   
            cout<<"HOLAAAAAAA";
            retorno.second.push(argumento);
            memset(argumento, '\0', strlen(argumento));
            tieneParametros = false;
        }
        pos++;
    }

    comandoNombre = new char[20];
    comandoNombre = strtok(comandoEntero, " ");

    if(strcmp(comandoNombre, "ayuda") == 0)
    {
        retorno.first = AYUDA;
        return retorno;
    }
    else if(strcmp(comandoNombre, "login") == 0)
    {
        retorno.first = LOGIN;
        return retorno;
    }
    else if(strcmp(comandoNombre, "logout") == 0)
    {
        retorno.first = LOGOUT;
        return retorno;
    }
    else if(strcmp(comandoNombre, "listar_buses") == 0)
    {
        retorno.first = LISTAR_BUSES;
        return retorno;
    }
    else if(strcmp(comandoNombre, "listar_rutas") == 0)
    {
        retorno.first = LISTAR_RUTAS;
        return retorno;
    }
    else if(strcmp(comandoNombre, "listar_viajes") == 0)
    {
        retorno.first = LISTAR_VIAJES;
        return retorno;
    }

    // printf("\n%s", retorno.second.front());
    // retorno.second.pop();
    // printf("\n%s", retorno.second.front());

    retorno.first = NULL_COMMAND;
    return retorno;
}