scanf表示c代码中的char错误

时间:2018-04-21 13:51:28

标签: c string scanf

我的代码中有一个非常奇怪的问题。 每次我的程序使用scanf获取char变量的值之后,它会混乱接下来发生的所有事情,并在循环开始时跳过gets(菜单)。 不使用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");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

您可以轻松修复代码:

  • 从不使用gets因为此功能不安全且已从C标准中移除,请使用fgets()内容。
  • 使用fgets()将用户输入读入数组,并将该数组的第一个字符用作char值。

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