2017-09-26 65 views
1
  • 列表项

我有使用getchar() method.What我想是计算小组件模拟器与由用户的形式ADD Rx Ry下写入8个命令的问题其中RxRy是寄存器。我不允许使用字符串和数组,所以唯一的选择是通过char读取char。的getchar()函数奇怪

我的问题是,我不知道如何从输入一行文本读取多个字符,并把它放在variables.For例如,ADD Rx Ry我想存储在ch1ADch2Dch3然后跳过空间验证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); 
+0

你给什么输入?它是否包含换行符?你读过换行吗?你期望输出什么?你会得到什么输出? –

+0

你也必须阅读换行符。 –

回答

0

当用户键入 “通过增加RX RY”,他会敲回车。

getchar()一次只消耗一个字符。

所以,为了消耗这个输入,你需要调用getchar() 8次,3用于“ADD”,2用于空白,4用于寄存器。

现在你想输入“ADD Ri Rj”,所以你认为你需要再次拨打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); 
0

你也必须阅读换行符。另外,扫描后,您必须刷新stdin以删除任何多余的输出。如果你不能使用字符串和数组,并且唯一的选择是使用getchar,你将不会手动管理4个字符的缓冲区,这不会很漂亮。

  1. 用户输入ADD\n(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这是会发生什么。

  2. ADD被扫描时,ch1包含'A'ch2包含'D'ch3包含'D''\n'留在stdin中。
  3. 下一次迭代来了。用户再次输入ADD\n
  4. 然而,'\n'从以前的扫描中stdin离开,所以ch1包含'\n'ch2包含'A'ch3包含'D'并有D\n剩余的stdin
+0

@Bob__和?我的代码与OP代码不相同,因为OP的代码已损坏。 – MarkWeston

0

当你开始输入数据到终端中,说第一键入 “ADD \ n” 个,

  • A存储在CH1
  • d被存储在CH 2
  • d被存储in ch3

并且'\ n'被发送到缓冲区。现在你开始输入新的字符集的第二次,说“SUB”的getchar()开始从缓冲区,它遇到的是“\ n”,所以第一个字符阅读, 因此

  • CH1 = '\ n'
  • CH 2 = 'S'
  • CH3 = 'U'

更好的修复程序的一个问题是后所有三个的getchar()秒,将消耗添加一个的getchar()额外的'\ 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; 

}