2014-11-01 100 views
0

我正在制作一个基于文本的游戏,并且我遇到了很大的输入问题。这是一个我的问题代码的例子。所以,如果你编译/运行这个,并键入'abc',它将只取每一个,并通过循环发送它。我需要它做的只是第一个字符,有人输入,无论他们输入多少个。输入问题scanf()/ getchar()

而且,PS:我已经尝试过这种方式,它做了同样的事情:

#include <stdio.h> 
#include <stdlib.h> 

char c[2]; 

int main(int argc, char *argv[]){ 

    system("clear"); 

    while(1){ 
     printf("\nInput a character.\n"); 
     scanf("%1s", c); 
     printf("\nYour input: %c\n", c[0]); 
     sleep(1); 
     system("clear"); 
    } 

    return 0; 
} 

编辑:它也增加了一个空间,你什么都输入,我认为它是一个\ 0,但我不知道。谢谢!

+0

通常,标准输入缓冲,直到用户按下回车键。获取单个字符的方法因操作系统而异。你在使用哪种操作系统? – user3386109 2014-11-01 19:08:03

+0

我使用的是Ubuntu 14.04 LTS – 2014-11-01 19:08:46

+0

这实际上令人沮丧的是,这个标准并没有给出处理这种情况的好方法。在POSIX系统上,你可以使用'getline',它工作得非常好。 – MicroVirus 2014-11-01 19:08:47

回答

0

我想你可以添加1更多的线路来读取第一个后过来的所有字符,直到有一个换行符(即用户按下回车键):

while (getchar() != '\n'); 

添加到您的例子,它会是这样:

#include <stdio.h> 
#include <stdlib.h> 

char c; 

int main(int argc, char *argv[]){ 

system("clear"); 

while(1){ 
    printf("\nInput a character.\n"); 
    c = getchar(); 
    printf("\nYour input: %c\n", c); 
    sleep(1); 
    system("clear"); 
    while (getchar() != '\n'); 
} 

return 0; 
} 
+0

谢谢!这固定它! – 2014-11-01 19:46:24

0

当您使用scanf时,输入一个字符串并点击ENTER键,一个字符串和一个字符被放置在输入缓冲区中,它们分别是:输入的字符串和换行符。逐字符的字符或字符被scanf占用,但换行符保留在输入缓冲区中,除非您也使用该字符串。

getchar(),另一方面不会等待ENTER键,它会逐个字符地读出你的逻辑。

0

使用getch()不等待换行符。

0

什么,我想你寻找的是这样的代码,保存第一个字符,你也可以检查是否c=='\n“继续您的操作,但我不知道你想要之后省第一个字符:

int i,c; 
char save; 
for (i = 0;(c=getchar())!= EOF ; i++) 
{ 
    if (i == 0) 
     save = c; 
} 
0

您可以使用fgets(),并提取其第一个字符,像...

char ch[2], c; 
fgets(ch, 2, stdin); 
c = ch[0];