首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetChar()函数奇怪

GetChar()函数奇怪
EN

Stack Overflow用户
提问于 2017-09-26 07:50:27
回答 3查看 215关注 0票数 1
  • 列表项目

我在使用getchar() method.What时遇到了一个问题,我试图用用户在表单ADD Rx Ry下编写的8个命令计算一个小型程序集模拟器,其中RxRy是寄存器。我不允许使用字符串或数组,因此唯一的选择是逐字符读取字符。

我的问题是,我不知道如何从一行输入文本中读取多个字符,并将其放在variables.For示例中,我希望将A存储在ch1中,D存储在ch2中,D存储在ch3中,然后跳过空间验证R,将x存储在变量中,然后将y存储在相同的位置。

奇怪的是,当我在初始命令之后输入第二个命令时,下面显示的程序将不会显示完全相同的打印值(打印只是为了调试)。

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()将使用以前输入(如果有的话)中的尾换行符和字符。

因此,只需使用后面的换行符(并继续循环,因为您不想处理换行符,只想使用它),如下所示:

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2017-09-26 08:05:16

你也得读这条新闻。此外,您还必须刷新stdin以删除扫描后的任何多余输出。如果您不能使用字符串或数组,并且唯一的选择是使用getchar,那么您将没有手动管理4个字符的缓冲区,这将不是很好。

代码语言:javascript
复制
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时会发生什么情况:

  1. 用户输入ADD\n (4个字符)。
  2. ADD被扫描,ch1包含'A'ch2包含'D'ch3包含'D''\n'留在stdin中。
  3. 下一次迭代来了。用户再次输入ADD\n
  4. 但是,在上一次扫描时,'\n'仍然保留在stdin中,所以ch1包含'\n'ch2包含'A'ch3包含'D',在stdin中还有D\n剩余物。
票数 0
EN

Stack Overflow用户

发布于 2017-09-26 08:05:58

当您开始在终端中键入数据时,首先输入"ADD\n",

  • A存储在ch1中
  • D存储在ch2中
  • D存储在ch3中

超过'\n‘被发送到缓冲区。现在,当您第二次开始输入新的一组字符时,比如"SUB",getchar()就开始从缓冲区读取,它遇到的第一个字符就是'\n',等等。

  • ch1 =‘n’
  • ch2 = 'S‘
  • ch3 = 'U‘

一个更好的解决方法是在三个getchar()s之后添加一个getchar(),这些getchar()将消耗额外的'\n‘,并且不会打印相同的’\n‘。

代码语言:javascript
复制
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;

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46420659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档