将向量传递给函数以计算C中的长度

时间:2015-01-09 12:17:51

标签: c data-structures structure

#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的每个可能的返回值我似乎无法得到它

防守功能

FIRST printf -------输入应该只是一个大于0的数字,EOF应该返回一条像printf(“输入数字 - 再见!”)的消息,所以我试过

while( sscanf(buffer, "%d", &num) ==1 && num > 0 )

但是如果输入了像3dadswerudsad这样的东西它仍然有用

当用户输入向量的3个值时,如果为向量输入了除3个双精度以外的任何值,程序应该以消息终止,所以我试过

while( sscanf(buffer2, "%lf %lf %lf", &xin, &yin, &zin) ==3 )

但它没有检查这些不正确的输入!!

我要发疯了

2 个答案:

答案 0 :(得分:2)

该功能可以实现如下。

double length(struct vector vec)
{
    return sqrt( vec.x*vec.x + vec.y*vec.y + vec.z*vec.z );
}

答案 1 :(得分:1)

你几乎是对的,你需要命名形式和功能并适当地使用它:

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(并在相同的翻译单元中提供它们的实现),因此要求inline functions

 static inline double veclength (struct vector);

养成所有警告和编译的习惯。调试信息,例如gcc -Wall -Wextra -g

关于您使用sscanf(3)作为sscanf(buf, "%d", &num)的通知,如果buf包含3dxde,则3阅读num成功dxde {1}}未解析的)。您可能希望在%n中使用sscanf(阅读其文档!)或使用strtol(3)