我在使用getchar() method.What时遇到了一个问题,我试图用用户在表单ADD Rx Ry下编写的8个命令计算一个小型程序集模拟器,其中Rx和Ry是寄存器。我不允许使用字符串或数组,因此唯一的选择是逐字符读取字符。
我的问题是,我不知道如何从一行输入文本中读取多个字符,并将其放在variables.For示例中,我希望将A存储在ch1中,D存储在ch2中,D存储在ch3中,然后跳过空间验证R,将x存储在变量中,然后将y存储在相同的位置。
奇怪的是,当我在初始命令之后输入第二个命令时,下面显示的程序将不会显示完全相同的打印值(打印只是为了调试)。
do{
ch1=getchar();
ch2=getchar();
ch3=getchar();
if(ch1=='E' && ch2=='N'&& ch3=='D'){
break;
}
printf("%c",ch1);
printf("%c",ch2);
printf("%c",ch3);
}while(1);发布于 2017-09-26 08:50:21
当用户键入"ADD Rx Ry“时,他将按Enter键。
getchar()一次只消耗一个字符。
因此,为了使用这个输入,您需要调用getchar() 8次,3次调用"ADD",2次调用空白空间,4次调用寄存器。
现在您需要输入"ADD“,因此您需要再次调用getchar() 8次。
getchar()的第一个调用将使用来自前一个输入的尾行(当用户点击Enter时)!它不会像你希望的那样消耗“A”。
因此,当输入"END“时,getchar()将使用以前输入(如果有的话)中的尾换行符和字符。
因此,只需使用后面的换行符(并继续循环,因为您不想处理换行符,只想使用它),如下所示:
do {
ch1 = getchar();
if(ch1 == '\n')
continue;
ch2 = getchar();
if(ch2 == '\n')
continue;
ch3 = getchar();
if(ch3 == '\n')
continue;
ch4 = getchar();
if(ch4 == '\n')
continue;
if(ch1=='E' && ch2=='N'&& ch3=='D') {
break;
}
} while(1);发布于 2017-09-26 08:05:16
你也得读这条新闻。此外,您还必须刷新stdin以删除扫描后的任何多余输出。如果您不能使用字符串或数组,并且唯一的选择是使用getchar,那么您将没有手动管理4个字符的缓冲区,这将不是很好。
char ch1, ch2, ch3, ch4;
do {
ch1 = getchar(); if (ch1 == '\n') continue;
ch2 = getchar(); if (ch2 == '\n') continue;
ch3 = getchar(); if (ch3 == '\n') continue;
ch4 = getchar(); if (ch4 != '\n') continue;
if (ch1 == 'E' && ch2 == 'N' && ch3 == 'D' && ch4 == '\n') break;
} while (1);当您不考虑换行符和刷新stdin时会发生什么情况:
ADD\n (4个字符)。ADD被扫描,ch1包含'A',ch2包含'D',ch3包含'D'。'\n'留在stdin中。ADD\n。'\n'仍然保留在stdin中,所以ch1包含'\n',ch2包含'A',ch3包含'D',在stdin中还有D\n剩余物。发布于 2017-09-26 08:05:58
当您开始在终端中键入数据时,首先输入"ADD\n",
超过'\n‘被发送到缓冲区。现在,当您第二次开始输入新的一组字符时,比如"SUB",getchar()就开始从缓冲区读取,它遇到的第一个字符就是'\n',等等。
一个更好的解决方法是在三个getchar()s之后添加一个getchar(),这些getchar()将消耗额外的'\n‘,并且不会打印相同的’\n‘。
do{
ch1=getchar();
ch2=getchar();
ch3=getchar();
getchar();
if(ch1=='E' && ch2=='N'&& ch3=='D'){
break;
}
printf("%c",ch1);
printf("%c",ch2);
printf("%c",ch3);
}while(1);
return 0;}
https://stackoverflow.com/questions/46420659
复制相似问题