C++ 首次读取后,程序执行未在scanf()处停止
我希望在do-while()循环的每次迭代中,程序都会在scanf()函数处停止,但程序循环的次数与读取字符串在再次在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
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;
}