当输入浮动值时,C编程与交互式菜单的小问题

时间:2014-02-02 06:49:18

标签: c

我的程序适用于无效输入,例如char,数字超出范围,但是当输入浮点值(例如1.2)时会出现问题。程序再次打印菜单,并在打印错误信息之前要求用户输入。我试图修复的是不再打印菜单,但仍然很难。例如,

做出选择:1.1 [这是菜单内容] 进行选择:该选择无效。请再试一次。

#include <stdio.h>

#define QUIT 0

int menu();

int main(void)
{
    int choice;
    char c;
    choice = menu();
    while(choice != QUIT)   //execute so long as choice is not equal to QUIT
    {
        choice = menu();
    }
}

int menu(void)
{
    int option;

    printf("Text Encoder Service\n\n");
    printf("1.\tEnter name of input file (currently 'Secret.txt')\n");
    printf("2.\tEnter name of output file (currently not set)\n");
    printf("3.\tEnter number of characters data should be shifted (currently +7)\n");
    printf("4.\tEncode the text\n\n");
    printf("0.\tQuit\n\n");
    printf("Make your selection: ");

    while( (scanf(" %d", &option) != 1) /* non-numeric input */
        || (option < 0)               /* number too small */
        || (option > 4))              /* number too large */
    {
        fflush(stdin);                    /* clear bad data from buffer */
        printf("That selection isn't valid. Please try again.\n\n");
        printf("Your choice? ");
    }
    return option;
}

3 个答案:

答案 0 :(得分:0)

1.1的输入会导致以下内容:

  • 将字符串读入内部缓冲区。
  • 然后将其与给定的格式字符串进行匹配。
  • 在第一次不匹配时,scanf()呼叫停止,并返回成功扫描的值的数量。

让我们测试一下:

#include <stdio.h>
int main(int argc, char ** argv)
{
    while (1) {
        int option;
        int n = scanf(" %d", &option);
        printf("%d %d\n", n, option);
        if (n <= 0) break;
    }
}

这个程序读了一行。

假设我输入123 132

然后发生以下情况: *由于格式字符串以空格开头,因此消耗所有前导空格。在这种情况下,没有。 *然后消耗123并将其放入option。 *由于格式字符串已结束,因此解析已停止,n=1option=123。 *在下一个循环运行中,同样的情况发生,给出n=1option=123

但是:假设我输入123.321123#321

然后发生以下情况: *由于格式字符串以空格开头,因此消耗所有前导空格。在这种情况下,没有。 *然后消耗123并将其放入option。 *由于格式字符串已结束,因此解析已停止,n=1option=123。 *在下一个循环运行中,没有要跳过的空格。 .321 resp。尝试将#321%d匹配,但这些都不是有效的整数。因此,我们得到n=0option保留其旧值。 *由于输入流中没有消耗任何字符(使用的字符再次被放回),所以同样会一次又一次地发生 - 这就是我放if (n <= 0) break;的原因。

所以你看到这个行为与浮点无关,因为如果我们使用.#来“干扰”并不重要。

我们将程序更改为

#include <stdio.h>
int main(int argc, char ** argv)
{
    while (1) {
        int option; char c;
        int n = scanf("%d%c", &option, &c);
        printf("%d %d %d %c\n", n, option, c, c);
        if (n <= 0) break;
    }
}

并运行它,输入4.235#6x7

然后我们得到 第一次运行时n=2option=4c='.' 第二轮* n=2option=235c='#' 第3轮* n=2option=6c='x' 第3轮* n=2option=7c='\n'(换行)

并提示您进一步输入。

这使您可以选择

(parsed_inputs = scanf("%d%c", &option, &overcount_char)) < 1

,然后检查overcount_char包含的内容,只要parsed_inputs为&gt; 1。

答案 1 :(得分:0)

我终于可以验证浮动输入了。非常感谢你的建议!这是我的新代码。您认为无效输入还有什么?

int menu(void)
{
    int option, parsed_inputs;
    char overcount_char;
    parsed_inputs = 1;

    printf("Text Encoder Service\n\n");
    printf("1.\tEnter name of input file (currently 'Secret.txt')\n");
    printf("2.\tEnter name of output file (currently not set)\n");
    printf("3.\tEnter number of characters data should be shifted (currently +7)\n");
    printf("4.\tEncode the text\n\n");
    printf("0.\tQuit\n\n");
    printf("Make your selection: ");

    parsed_inputs = scanf_s("%d%c", &option, &overcount_char);
    while( parsed_inputs > 1 )              /* number too large */
    {
        if((overcount_char != '\n') || (option < 0) || (option > 4))
        {
            fflush(stdin);                    /* clear bad data from buffer */
            printf("That selection isn't valid. Please try again.\n\n");
            printf("Your choice? ");
            scanf_s("%d%c", &option, &overcount_char);
        }
        else
            break;
    }
    return option;
}

答案 2 :(得分:-1)

我认为你应该在while循环之前放置scanf()并在while循环中显式检查“option”变量。 发生了什么,这里scanf()总是返回值1,因为scanf()返回no。参数读取成功。因此,while循环将永远运行。有关详细信息,请查看此链接 - &gt; http://www.cplusplus.com/reference/cstdio/scanf/

希望这有帮助!