2017-03-17 35 views
-1

我正在尝试为某个东西创建一个模拟器,并且在处理器的主循环中,我想实现一个简单的方法来一次一步地执行CPU一个循环通过按Enter输入每个循环提示),以便我可以看到每个步骤正在执行的指令。此外,它允许您输入一个数字,而不仅仅是Enter来将默认步长值从1更改为其他值(因此它会跳过x个循环,然后一次返回1)。如果按Enter键,fgets()会忽略随后的输入

问题当我输入一个数字时(跳过循环的数量,然后每个周期再次提示我),它可以正常工作,但是当我按Enter键而不是输入数字时,我希望它默认为1步,而是按Enter键它只是在整个程序运行而没有再次提醒我。我如何进入== 1?

void CPU_loop() 
{ 
    ... 


    static int step = 1; 
    char cmd[10]; 
    if(step == 1) 
    { 
     if(fgets(cmd, 10, stdin) != NULL) // If you entered something other than Enter; doesn't work 
     { 
      step = std::atoi(cmd); // Set step amount to whatever you entered 
     } 
    } 
    else 
    { 
     --step; 
    } 

    ... 
} 
+0

仅有手动使用'getchar'标准输入自己读取输入。只需将文本放入缓冲区,直到您收到换行符。然后你可以按照你的意愿处理文本。 – bace1000

+0

按Enter键时'cmd'的值是多少?那么“step”的价值是什么? –

回答

1

当你按下直接输入,它不会默认为1,而是要传递的STR荷兰国际集团"\n"std::atoi()std::atoi()不能被用来进行完整性检查它的输入,你可以使用一个不同的功能像std::strtol()或者,你可以简单地添加

if (step == 0) 
    step = 1; 

因为当,std::atoi()需要"\n"作为输入,它返回0。阅读documentation以进一步了解它。

引用的文档对应于成功str的内容

的整数值。如果转换后的值超出了相应返回类型的范围,则返回值未定义。 如果不能执行转换,则返回0

还有一件事,你可以用C++的方式使用流输入来避免所有这些。

+0

非常感谢!这工作完美。我一直认为这个问题源于fgets而不是atoi。我希望我没有浪费一个多小时试图解决错误的问题! –

0

你可以这样做:

if (fgets(cmd, 10, stdin) != NULL) 
{ 
    if (cmd[0] == '\n'){ 
     step = 1; 
    } 
    else{ 
     step = std::atoi(cmd); // Set step amount to whatever you entered 
    } 
} 
+0

对不起,如果按下ENTER,它会通过''\ n“'到'std :: atoi()'。 –

+0

我很抱歉。编辑。 – ChrisB