2010-11-22 95 views
3

当我试图使用scanf并获取,我遇到了麻烦,我需要把获取两次,如果我把它一旦我的程序被终止,它的功课,我必须在那些地方使用这些功能。为什么我遇到scanf问题并得到?

代码:

int main() 
{ 
    int i=0,operation=0; 
    char str[100]; 

    printMenu(); 

    scanf("%d",&operation); 

    switch (operation) 
    { 
     case 1:  
      printf("Please, enter your sentence >"); 
      gets(str); 
      gets(str); 

      if (checkChars(str)) 
       inputSent(str); 
      else 
       printf("ERROR: Incorrect data, try again."); 

      break; 
    } 

    return 0; 
} 
+2

什么可能出问题使用`gets`? – icecrime 2010-11-22 22:22:47

+0

你确定你没有CheckChars()或inputSent()的麻烦吗? – GreenMatt 2010-11-22 22:27:57

回答

0

发生了什么事是后你的第一个scanf()的是,仍然有数据输入缓冲器(即划的事情,通常返回任何形式的空白)缠绵,当你呼叫下一个gets()它会立即返回,因为它读取了在输入数字后您点击的“输入”。 为了解决这个问题,你需要刷新输入缓冲区。这是一个很好的做法,特别是在阅读个别字符单词和句子时进行切换这里有一个小片段,我从另一个线程,可以帮助你发现(这将您scanf()去后):

while (getchar() != EOF);
它的作用,直到没有剩下不断读出的字符输入缓冲区的。这可能不是所有情况下的最佳解决方案,但它应该足以帮助您完成这项任务。

1

所以,我们有一个stdin数据流。这是您在终端写入的输入。

当您拨打scanf时,它只会读取您写入的十进制数。它不读取后面的换行符。因此,您需要拨打gets两个电话,因为第一个呼叫只能看到'\n',而第二个看到您的实际数据。

要解决这个问题,我建议您在获取操作时使用gets读取完整行,然后使用sscanf获取操作。

例如:

printMenu(); 

gets(str) 
sscanf(str, "%d", &operation); 

switch (operation) {