C程序运行时冻结

#包括<标准h>
#包括<stdlib.h>
#包括<数学h>
int main()
{
int x1,x2,x3,
y1,y2,y3,
ystr1,ystr2,ystr3,
xstr1,xstr2,xstr3,
sstr1、sstr2、sstr3;
printf(“插入”);
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
ystr1=y2-y1;
xstr1=x2-x1;
sstr1=sqrt(pow(xstr1,2)+pow(ystr1,2));
ystr2=y3-y2;
xstr2=x3-x2;
sstr2=sqrt(pow(xstr2,2)+pow(ystr2,2));
ystr3=y3-y1;
xstr3=x3-x1;
sstr3=sqrt(pow(xstr1,2)+pow(ystr1,2));
printf(“打印%d、%d、%d”、sstr1、sstr2、sstr3”);
返回0;
}

由于某种原因,每次我输入一个位数时,此代码都会冻结。我真的不知道是什么原因造成的。是因为太多的INT吗

scanf函数需要指针作为参数,以便修改正在读取的变量。请记住,C中的所有参数都是通过值传递的。如果我们想用函数修改某些内容,我们需要在内存中传递它的地址(指针)

即使未启用显式警告,代码生成的警告也会使这一点变得明显

test.c:在函数“main”中:
test.c:14:13:警告:格式“%d”要求参数类型为“int*”,但参数2的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
~^
test.c:14:15:警告:格式“%d”要求参数类型为“int*”,但参数3的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
~^
test.c:14:17:警告:格式“%d”要求参数类型为“int*”,但参数4的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
~^
test.c:14:19:警告:格式“%d”要求参数类型为“int*”,但参数5的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
~^
test.c:14:21:警告:格式“%d”要求参数类型为“int*”,但参数6的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);
~^
test.c:14:23:警告:格式“%d”要求参数的类型为“int*”,但参数7的类型为“int”[-Wformat=]
扫描频率(“%d%d%d%d%d%d%d””,x1,y1,x2,y2,x3,y3);

因此,不是:

scanf(“d%d%d%d%d%d%d%d",x1,y1,x2,y2,x3,y3”);

你会想写:

scanf(“d%d%d%d%d%d%d%d”、“x1”、“y1”、“x2”、“y2”、“x3”、“y3”);

&amp运算符返回变量的地址

还需要注意的是,scanf返回一个int值。此值表示读取的值数。您可能应该检查scanf("%d%d%d%d%d%d"、x1、y1、x2、y2、x3、y3)返回6

如果(扫描频率("d%d%d%d%d%d%d%d"、&x1、&y1、&x2、&y2、&x3、&y3)==6){
...
}

您可能希望做的另一件事是为变量设置初始值。如果scanf失败,您仍然可以使用该初始值

发表评论