【问题标题】:why i'm having problems with scanf and gets?为什么我的 scanf 和 get 有问题?
【发布时间】:2010-11-22 22:15:42
【问题描述】:

当我尝试使用scanf 和gets 时,我遇到了麻烦,我需要放置两次gets,如果我在我的程序终止后放置它,这是家庭作业,我必须在那些地方使用这些功能。

代码:

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;
}

【问题讨论】:

  • 使用gets 可能会出什么问题?
  • 您确定 CheckChars() 或 inputSent() 没有问题吗?

标签: c scanf


【解决方案1】:

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

当您调用scanf 时,它只会读取您输入的十进制数。它不会读取它之后的换行符。因此,您需要两次调用 gets,因为第一次调用只看到 '\n',而第二次看到您的实际数据。

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

例如:

printMenu();

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

switch (operation) {

【讨论】:

    【解决方案2】:

    在您的第一个 scanf() 之后发生的事情是输入缓冲区中仍然存在数据(任何形式的分隔事物的空格,通常是返回),当您调用下一个 gets() 时,它会立即返回,因为它读取输入数字后点击的“输入”。 为了解决这个问题,您需要刷新输入缓冲区。这是一种很好的做法,尤其是在阅读单个字符单词和句子之间切换时。这是我从另一个线程中找到的一个小 sn-p,可能会对您有所帮助(这将在您的 scanf() 之后):

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

    【讨论】:

    • while (getchar() != '\n'); 会不会更接近这里的必要条件?
    猜你喜欢
    • 2014-12-23
    • 2023-01-14
    • 2021-11-29
    • 2015-11-30
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多