【问题标题】:scanf for char error in c code [duplicate]c代码中的scanf for char错误[重复]
【发布时间】:2018-04-21 13:51:27
【问题描述】:

我的代码中有一个非常奇怪的问题。 每次我的程序使用 scanf 获取 char 变量的值后,它都会弄乱接下来发生的所有事情,并在循环开始时跳过 get(menu)。 不使用 scanf 时不会发生这种情况。有什么想法吗?

void main()
{
    char menu[20] = { 0 }, ch, ch2 = 0, str[SIZE] = { 0 }, str2[SIZE] = { 0 }, mat[SIZE][SIZE] = { 0 };
    int boo = 1, loop = 0, num;
    while (loop == 0)
    {
        printMenu();
        gets(menu);
        num = menuNum(menu);
        switch (num)
        {
        case 0:
            loop = 100;
            break;
        case 1:
            boo = 1;
            printf("Please enter a long string\n");
            gets(str);
            printf("Please choose separation character\n");
            scanf("%c", &ch);
            createMat(str, ch, mat);
            break;
        case 2:
            if (mat[0][0] == '\0')
                printf("Matrix does not exist!\n");
            else
            {
                printMatrix(mat);
            }
            break;
        case 3:
            boo = longShort(mat);
            break;
        case 4:
            printf("Please enter a long string\n");
            gets(str2);
            printf("Please choose separation character\n");
            scanf("%c", &ch);
            compareMat(str2, ch2, mat);
            break;
        default:
            printf("Not a valid option!\n");
        }
    }
}

【问题讨论】:

  • 我忘了说这是一个任务,因此我不能使用任何复杂的东西。只是我已经使用的基础知识。
  • void main 是错误的。 main 应该返回 int
  • 不要使用scanf 进行用户输入,也不要使用gets(它已从C11 中删除)。

标签: c string scanf


【解决方案1】:

scanf("%c", &c); 从输入流中读取一个字节,并将输入的其余部分留待处理,因此下一个gets 将读取待处理的换行符并且无法等待用户输入。

您可以轻松地修复您的代码:

  • 切勿使用gets,因为此函数不安全且已从 C 标准中删除,请使用 fgets() insead。
  • 使用fgets() 将用户输入读入一个数组,并将该数组的第一个字符用作您的char 值。

gets()fgets() 的区别在于您将目标数组的大小提供给fgets(),这样可以防止输入过长造成混乱。但是请注意,如果数组足够大并且换行符确实存在于文件末尾之前的输入流中,则结尾的换行符 '\n' 将出现在数组的末尾,在空终止符之前。你需要自己处理它,要么忽略它,要么删除它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多