将向量传递给函数以计算 C 中的长度
Passing a vector to a function to calculate length in C
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct vector
{
double x;
double y;
double z;
};
struct vector *array;
double length(struct vector*);
int main()
{
int num,i;
double xin;
double yin;
double zin;
char buffer[30];
char buffer2[30];
printf("Enter number of vectors:");
fgets(buffer, 30, stdin);
sscanf(buffer, "%d", &num);
array = malloc( sizeof(struct vector) * num);
for(i=0;i<=num;i++)
{
printf("Please enter x y z for the vector:");
fgets(buffer2,100,stdin);
sscanf(buffer2, " %lf %lf %lf", &xin, &yin, &zin);
array[i].x = xin;
array[i].y = yin;
array[i].z = zin;
}
for(i=0;i<=num;i++)
{
printf( "Vector:%lf %lf %lf has a length of %lf\n", array[i].x, array[i].y, array[i].z, length(&array[i]));
}
}
double length(struct vector* vec)
{
return sqrt( (vec->x * vec->x) + (vec->y * vec->y) + (vec->z * vec->z) );
}
好的,上面的代码差不多完成了,它询问用户向量的数量,然后它询问用户这些向量的值,然后它会计算长度并相应地打印出来。
我想在这里进行一些错误检查,但我似乎无法得到它...我查找了 fgets 和 sscanf 的每个可能的 return 值我似乎无法得到它
防御特征
FIRST printf------输入应该只是一个大于 0 的数字,EOF 应该 return 像 printf("enter a number--bye!") 这样的消息所以我试过
while( sscanf(buffer, "%d", &num) ==1 && num > 0 )
但如果输入类似 3dadswerudsad 的内容,它仍然有效
同样,当用户为向量输入 3 个值时,如果为向量输入的不是 3 个双精度值,程序应该终止并显示一条消息,所以我尝试了
while( sscanf(buffer2, "%lf %lf %lf", &xin, &yin, &zin) ==3 )
但它不会检查这些不正确的输入!!
我要疯了
你几乎是对的,你需要命名形式和函数并适当地使用它:
double veclength (struct vector v) {
return sqrt( (v.x * v.x) + (v.y * v.y) + (v.z * v.z) );
}
出于效率和其他原因,您可能会考虑传递一个指针(指向一个常量向量,因为您不修改它)
double veclengthptr (const struct vector* v) {
return sqrt( (v->x * v->x) + (v->y * v->y) + (v->z * v->z) );
}
然后您可以稍后使用 veclength(array[i])
或 veclengthptr(array+i)
(与 veclengthptr(&a[i])
相同)
在使用这些函数之前,您应该提供原型(可能在某些头文件中):
double veclength (struct vector);
double veclengthptr (const struct vector*);
请注意,出于效率原因,您可能希望将这些原型声明为 static inline
(并在 same 翻译单元中提供它们的实现),因此要求 inline functions:
static inline double veclength (struct vector);
养成编译所有警告和调试信息的习惯,例如gcc -Wall -Wextra -g
关于您使用 sscanf(3) as sscanf(buf, "%d", &num)
notice that if buf
contains 3dxde
it succeeds by reading 3
into num
(with dxde
unparsed). You might want to use %n
in sscanf
(read its documentation!) or use strtol(3)
该功能可以实现如下。
double length(struct vector vec)
{
return sqrt( vec.x*vec.x + vec.y*vec.y + vec.z*vec.z );
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct vector
{
double x;
double y;
double z;
};
struct vector *array;
double length(struct vector*);
int main()
{
int num,i;
double xin;
double yin;
double zin;
char buffer[30];
char buffer2[30];
printf("Enter number of vectors:");
fgets(buffer, 30, stdin);
sscanf(buffer, "%d", &num);
array = malloc( sizeof(struct vector) * num);
for(i=0;i<=num;i++)
{
printf("Please enter x y z for the vector:");
fgets(buffer2,100,stdin);
sscanf(buffer2, " %lf %lf %lf", &xin, &yin, &zin);
array[i].x = xin;
array[i].y = yin;
array[i].z = zin;
}
for(i=0;i<=num;i++)
{
printf( "Vector:%lf %lf %lf has a length of %lf\n", array[i].x, array[i].y, array[i].z, length(&array[i]));
}
}
double length(struct vector* vec)
{
return sqrt( (vec->x * vec->x) + (vec->y * vec->y) + (vec->z * vec->z) );
}
好的,上面的代码差不多完成了,它询问用户向量的数量,然后它询问用户这些向量的值,然后它会计算长度并相应地打印出来。
我想在这里进行一些错误检查,但我似乎无法得到它...我查找了 fgets 和 sscanf 的每个可能的 return 值我似乎无法得到它
防御特征
FIRST printf------输入应该只是一个大于 0 的数字,EOF 应该 return 像 printf("enter a number--bye!") 这样的消息所以我试过
while( sscanf(buffer, "%d", &num) ==1 && num > 0 )
但如果输入类似 3dadswerudsad 的内容,它仍然有效
同样,当用户为向量输入 3 个值时,如果为向量输入的不是 3 个双精度值,程序应该终止并显示一条消息,所以我尝试了
while( sscanf(buffer2, "%lf %lf %lf", &xin, &yin, &zin) ==3 )
但它不会检查这些不正确的输入!!
我要疯了
你几乎是对的,你需要命名形式和函数并适当地使用它:
double veclength (struct vector v) {
return sqrt( (v.x * v.x) + (v.y * v.y) + (v.z * v.z) );
}
出于效率和其他原因,您可能会考虑传递一个指针(指向一个常量向量,因为您不修改它)
double veclengthptr (const struct vector* v) {
return sqrt( (v->x * v->x) + (v->y * v->y) + (v->z * v->z) );
}
然后您可以稍后使用 veclength(array[i])
或 veclengthptr(array+i)
(与 veclengthptr(&a[i])
相同)
在使用这些函数之前,您应该提供原型(可能在某些头文件中):
double veclength (struct vector);
double veclengthptr (const struct vector*);
请注意,出于效率原因,您可能希望将这些原型声明为 static inline
(并在 same 翻译单元中提供它们的实现),因此要求 inline functions:
static inline double veclength (struct vector);
养成编译所有警告和调试信息的习惯,例如gcc -Wall -Wextra -g
关于您使用 sscanf(3) as sscanf(buf, "%d", &num)
notice that if buf
contains 3dxde
it succeeds by reading 3
into num
(with dxde
unparsed). You might want to use %n
in sscanf
(read its documentation!) or use strtol(3)
该功能可以实现如下。
double length(struct vector vec)
{
return sqrt( vec.x*vec.x + vec.y*vec.y + vec.z*vec.z );
}