char和scanf_s()有问题

char和scanf_s()有问题,c,compiler-construction,char,C,Compiler Construction,Char,我刚开始使用C语言,在编译时遇到了一些问题。 编译器似乎经常遇到char的问题。 请注意,我必须在%c之前添加空格。 现在,在网上研究了一段时间后,我了解到,在&flag之后添加1基本上解决了这个问题,但我宁愿完全解决这个问题,因为它应该可以像这样工作。 我正在使用Visual studio 2013 btw #include <stdio.h> void main() { int num; char flag; while (1) { printf("

我刚开始使用C语言,在编译时遇到了一些问题。 编译器似乎经常遇到char的问题。 请注意,我必须在%c之前添加空格。 现在,在网上研究了一段时间后,我了解到,在&flag之后添加1基本上解决了这个问题,但我宁愿完全解决这个问题,因为它应该可以像这样工作。 我正在使用Visual studio 2013 btw

#include <stdio.h>

void main()
{

  int num;
  char flag;
  while (1)
  {

    printf("Please enter your no.:");
    scanf_s("%d", &num);

    if (num > -1)
    {

      if (num < 10)
      {
        printf("Your number is 1 digit.\n");
      }

      else if (num < 100)
      {
        printf("Your number is 2 digits.\n");
      }

      else if (num < 1000)
      {
        printf("Your number is 3 digits.\n");

      }

      else if (num > 999)
      {
        printf("Your number has a lot of digits.\n");

      }
    }

    else
    {
      printf("Please input a correct value.\n");

    }

    printf("Would you like to countinue? y/n \n");
    scanf_s(" %c", &flag)
    // problem

    if (flag == 'n')
    {
      exit(0);
    }
  }

}
#包括
void main()
{
int-num;
字符标志;
而(1)
{
printf(“请输入您的编号:”;
scanf_s(“%d”和&num);
如果(数值>-1)
{
如果(数值<10)
{
printf(“您的号码是1位数字。\n”);
}
否则如果(数值<100)
{
printf(“您的号码是2位数字。\n”);
}
否则如果(数值<1000)
{
printf(“您的号码是3位数字。\n”);
}
如果(num>999),则为else
{
printf(“您的号码有很多数字。\n”);
}
}
其他的
{
printf(“请输入正确的值。\n”);
}
printf(“您想继续吗?是/否\n”);
扫描单位(“%c”和标志)
//问题
如果(标志='n')
{
出口(0);
}
}
}

您的代码无效,必须使用
scanf\u s()
指定缓冲区大小:

scanf
wscanf
不同,
scanf\u s
wscanf\u s
要求为类型为c、c、s、s或[]的所有输入参数指定缓冲区大小。以字符为单位的缓冲区大小作为指向缓冲区或变量的指针后的附加参数传递


这就是为什么如果您添加make call
scanf_s(“%c”和&flag,1);

并删除“%c”中的空格(即“%c”)时,它会起作用对于以上内容。谢谢,这就解决了问题。但是我仍然需要在%c之前加上空格。@VDN在这种情况下,格式字符串中的空格需要用来使用stdin中的换行符,因为之前在while()循环开始时使用scanf_s来读取num。@Nigel Harper-感谢您提供的信息。