C 运行时检查失败#2-围绕变量';检查';腐败

C 运行时检查失败#2-围绕变量';检查';腐败,c,C,我遇到了这个问题:运行时检查失败#2-visual studio 12中变量“Check”周围的堆栈已损坏。我也在代码块中尝试了这一点,但遇到了同样的问题。我也在ideone.com上运行我的代码,它显示运行时错误。它对Y有效,但对N无效 int main() { int led=0; int欧姆=0; 字符检查; int标志=0; 而(发光二极管3){ printf(“输入要关闭的开关的编号:\n\n”); printf(“**********************按下1开关(LED)1**

我遇到了这个问题:运行时检查失败#2-visual studio 12中变量“Check”周围的堆栈已损坏。我也在代码块中尝试了这一点,但遇到了同样的问题。我也在ideone.com上运行我的代码,它显示运行时错误。它对Y有效,但对N无效

int main() {

int led=0;
int欧姆=0;
字符检查;
int标志=0;
而(发光二极管<1 | |发光二极管>3){
printf(“输入要关闭的开关的编号:\n\n”);
printf(“**********************按下1开关(LED)1*********************\n”);
printf(“**********************按2键切换(LED)2******************\n”);
printf(“**********************按3键切换(LED)3******************\n”);
printf(“开关:”);
扫描频率(“%d”和led);
}
printf(“\n\n”);
而(欧姆<1 | |欧姆>3){
printf(“输入变阻器的电阻:\n\n”);
printf(“**********************按1表示10欧姆电阻*********************\n”);
printf(“**********************按2表示20欧姆电阻*********************\n”);
printf(“*******************按3表示30欧姆电阻*********************\n”);
printf(“阻力:”);
扫描频率(“%d”和欧姆);
}
while(标志==0)
{
//发光二极管-1
如果(发光二极管=1和欧姆=1)
{
printf(“LED-1闪烁2次\n”);
}
如果(发光二极管=1和欧姆=2)
{
printf(“LED-1闪烁4次\n”);
}
如果(发光二极管=1和欧姆=3)
{
printf(“LED-1闪烁6次\n”);
}
//发光二极管-2
如果(发光二极管=2和欧姆=1)
{
printf(“LED-2闪烁2次\n”);
}
如果(发光二极管=2和欧姆=2)
{
printf(“LED-2闪烁4次\n”);
}
如果(发光二极管=2和欧姆=3)
{
printf(“LED-2闪烁6次\n”);
}
//发光二极管-3
如果(发光二极管==3和欧姆==1)
{
printf(“LED-3闪烁2次\n”);
}
如果(发光二极管==3和欧姆==2)
{
printf(“LED-3闪烁4次\n”);
}
如果(发光二极管=3和欧姆=3)
{
printf(“LED-3闪烁6次\n”);
}
printf(“您想继续是(Y)还是否(N):”;
scanf(“%s”和“检查”);
如果(检查=='Y'| |检查=='Y')
{
发光二极管=0;
欧姆=0;
而(发光二极管<1 | |发光二极管>3){
printf(“输入要关闭的开关的数量:”;
扫描频率(“%d”和led);
}
而(欧姆<1 | |欧姆>3){
printf(“输入变阻器的电阻:”);
扫描频率(“%d”和欧姆);
}
}
如果(检查=='N'|检查=='N')
{
printf(“感谢您使用该程序”);
flag=1;
}
}
返回0;

}问题是您的变量“check”太小

scanf("%1s", check);
由于要保存字符串(终止为\0),因此应使用较大的变量:

char check[2];

编辑:但是是的,如果输入只有一个字符,scanf(“%c”,&check)要好得多。

问题在于变量“check”太小

scanf("%1s", check);
由于要保存字符串(终止为\0),因此应使用较大的变量:

char check[2];

编辑:但是是的,如果输入只有一个字符,scanf(“%c”,&check)要好得多。

scanf(“%s”,&check)应该是
scanf(“%c”,&check)当您读取的是
字符而不是字符串时。

scanf(“%s”和&check)应该是
scanf(“%c”,&check)当你读一个
字符时
不是一个字符串。

它在代码块中对我来说工作正常。。。。 刷新缓冲区中的所有数据,即在读取数据输入缓冲区后刷新输入缓冲区 i、 电子扫描(“%d”和led); fflush(stdin);
这样,它将在读取数据后清除输入缓冲区。

在代码块中对我来说工作正常。。。。 刷新缓冲区中的所有数据,即在读取数据输入缓冲区后刷新输入缓冲区 i、 电子扫描(“%d”和led); fflush(stdin);
这样,它将在读取数据后清除输入缓冲区。

在语句
scanf(“%s”,&check)中您正在尝试扫描字符串并将其填充到字符中。有几种方法可以解决此问题:

快速修复:将
scanf(“%s”,&check)
替换为
scanf(“%c”,&check)
。请注意格式字符串中的空白:
%c“
,而不仅仅是
%c”
%c
格式说明符不跳过前导空格,因此必须在格式字符串中的
%c
之前包含空格,以明确向
scanf()
发出要跳过前导空格的信号。如果不这样做,则会发生以下情况:

  • 从上一个提示输入变阻器的电阻:
  • 后,输入流中左侧的回车将作为输入字符<代码>检查将被分配
    \n

  • 如果
  • 条件失败,则两个条件都将失效<代码>检查既不是
    Y
    也不是
    Y
    ,既不是
    N
    也不是
    N

  • 执行将返回到
    的顶部,而
    标志的
    循环仍为零。因此,有关
    欧姆
    发光二极管
    的适当值的输出将再次显示,然后将再次显示
    检查
    的提示

  • scanf()
    将再次检查输入流,这次读取用户输入的实际选择,并执行适当的操作

  • 通过在格式字符串中包含前导空格,可以避免重复输出

    更好的修复方法:每次调用
    scanf()